Rename blank to parseHelper (#354)

This commit is contained in:
Michael Snoyman 2012-08-01 15:57:06 +03:00
parent aa93e562bb
commit 5ece1e96e4
3 changed files with 29 additions and 22 deletions

View File

@ -47,7 +47,7 @@ module Yesod.Form.Fields
import Yesod.Form.Types import Yesod.Form.Types
import Yesod.Form.I18n.English import Yesod.Form.I18n.English
import Yesod.Form.Functions (blank) import Yesod.Form.Functions (parseHelper)
import Yesod.Handler (getMessageRender) import Yesod.Handler (getMessageRender)
import Yesod.Widget (toWidget, whamlet, GWidget) import Yesod.Widget (toWidget, whamlet, GWidget)
import Yesod.Message (RenderMessage (renderMessage), SomeMessage (..)) import Yesod.Message (RenderMessage (renderMessage), SomeMessage (..))
@ -103,7 +103,7 @@ defaultFormMessage = englishFormMessage
intField :: (Integral i, RenderMessage master FormMessage) => Field sub master i intField :: (Integral i, RenderMessage master FormMessage) => Field sub master i
intField = Field intField = Field
{ fieldParse = blank $ \s -> { fieldParse = parseHelper $ \s ->
case Data.Text.Read.signed Data.Text.Read.decimal s of case Data.Text.Read.signed Data.Text.Read.decimal s of
Right (a, "") -> Right a Right (a, "") -> Right a
_ -> Left $ MsgInvalidInteger s _ -> Left $ MsgInvalidInteger s
@ -119,7 +119,7 @@ $newline never
doubleField :: RenderMessage master FormMessage => Field sub master Double doubleField :: RenderMessage master FormMessage => Field sub master Double
doubleField = Field doubleField = Field
{ fieldParse = blank $ \s -> { fieldParse = parseHelper $ \s ->
case Data.Text.Read.double s of case Data.Text.Read.double s of
Right (a, "") -> Right a Right (a, "") -> Right a
_ -> Left $ MsgInvalidNumber s _ -> Left $ MsgInvalidNumber s
@ -133,7 +133,7 @@ $newline never
dayField :: RenderMessage master FormMessage => Field sub master Day dayField :: RenderMessage master FormMessage => Field sub master Day
dayField = Field dayField = Field
{ fieldParse = blank $ parseDate . unpack { fieldParse = parseHelper $ parseDate . unpack
, fieldView = \theId name attrs val isReq -> toWidget [hamlet| , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
$newline never $newline never
<input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}"> <input id="#{theId}" name="#{name}" *{attrs} type="date" :isReq:required="" value="#{showVal val}">
@ -143,7 +143,7 @@ $newline never
timeField :: RenderMessage master FormMessage => Field sub master TimeOfDay timeField :: RenderMessage master FormMessage => Field sub master TimeOfDay
timeField = Field timeField = Field
{ fieldParse = blank parseTime { fieldParse = parseHelper parseTime
, fieldView = \theId name attrs val isReq -> toWidget [hamlet| , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
$newline never $newline never
<input id="#{theId}" name="#{name}" *{attrs} :isReq:required="" value="#{showVal val}"> <input id="#{theId}" name="#{name}" *{attrs} :isReq:required="" value="#{showVal val}">
@ -158,7 +158,7 @@ $newline never
htmlField :: RenderMessage master FormMessage => Field sub master Html htmlField :: RenderMessage master FormMessage => Field sub master Html
htmlField = Field htmlField = Field
{ fieldParse = blank $ Right . preEscapedText . sanitizeBalance { fieldParse = parseHelper $ Right . preEscapedText . sanitizeBalance
, fieldView = \theId name attrs val _isReq -> toWidget [hamlet| , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
$newline never $newline never
$# FIXME: There was a class="html" attribute, for what purpose? $# FIXME: There was a class="html" attribute, for what purpose?
@ -187,7 +187,7 @@ instance ToHtml Textarea where
textareaField :: RenderMessage master FormMessage => Field sub master Textarea textareaField :: RenderMessage master FormMessage => Field sub master Textarea
textareaField = Field textareaField = Field
{ fieldParse = blank $ Right . Textarea { fieldParse = parseHelper $ Right . Textarea
, fieldView = \theId name attrs val _isReq -> toWidget [hamlet| , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
$newline never $newline never
<textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val} <textarea id="#{theId}" name="#{name}" *{attrs}>#{either id unTextarea val}
@ -197,7 +197,7 @@ $newline never
hiddenField :: (PathPiece p, RenderMessage master FormMessage) hiddenField :: (PathPiece p, RenderMessage master FormMessage)
=> Field sub master p => Field sub master p
hiddenField = Field hiddenField = Field
{ fieldParse = blank $ maybe (Left MsgValueRequired) Right . fromPathPiece { fieldParse = parseHelper $ maybe (Left MsgValueRequired) Right . fromPathPiece
, fieldView = \theId name attrs val _isReq -> toWidget [hamlet| , fieldView = \theId name attrs val _isReq -> toWidget [hamlet|
$newline never $newline never
<input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}"> <input type="hidden" id="#{theId}" name="#{name}" *{attrs} value="#{either id toPathPiece val}">
@ -206,7 +206,7 @@ $newline never
textField :: RenderMessage master FormMessage => Field sub master Text textField :: RenderMessage master FormMessage => Field sub master Text
textField = Field textField = Field
{ fieldParse = blank $ Right { fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq -> , fieldView = \theId name attrs val isReq ->
[whamlet| [whamlet|
$newline never $newline never
@ -216,7 +216,7 @@ $newline never
passwordField :: RenderMessage master FormMessage => Field sub master Text passwordField :: RenderMessage master FormMessage => Field sub master Text
passwordField = Field passwordField = Field
{ fieldParse = blank $ Right { fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq -> toWidget [hamlet| , fieldView = \theId name attrs val isReq -> toWidget [hamlet|
$newline never $newline never
<input id="#{theId}" name="#{name}" *{attrs} type="password" :isReq:required="" value="#{either id id val}"> <input id="#{theId}" name="#{name}" *{attrs} type="password" :isReq:required="" value="#{either id id val}">
@ -286,7 +286,7 @@ timeParser = do
emailField :: RenderMessage master FormMessage => Field sub master Text emailField :: RenderMessage master FormMessage => Field sub master Text
emailField = Field emailField = Field
{ fieldParse = blank $ { fieldParse = parseHelper $
\s -> if Email.isValid (unpack s) \s -> if Email.isValid (unpack s)
then Right s then Right s
else Left $ MsgInvalidEmail s else Left $ MsgInvalidEmail s
@ -299,7 +299,7 @@ $newline never
type AutoFocus = Bool type AutoFocus = Bool
searchField :: RenderMessage master FormMessage => AutoFocus -> Field sub master Text searchField :: RenderMessage master FormMessage => AutoFocus -> Field sub master Text
searchField autoFocus = Field searchField autoFocus = Field
{ fieldParse = blank Right { fieldParse = parseHelper Right
, fieldView = \theId name attrs val isReq -> do , fieldView = \theId name attrs val isReq -> do
[whamlet|\ [whamlet|\
$newline never $newline never
@ -319,7 +319,7 @@ $newline never
urlField :: RenderMessage master FormMessage => Field sub master Text urlField :: RenderMessage master FormMessage => Field sub master Text
urlField = Field urlField = Field
{ fieldParse = blank $ \s -> { fieldParse = parseHelper $ \s ->
case parseURI $ unpack s of case parseURI $ unpack s of
Nothing -> Left $ MsgInvalidUrl s Nothing -> Left $ MsgInvalidUrl s
Just _ -> Right s Just _ -> Right s

View File

@ -37,7 +37,7 @@ module Yesod.Form.Functions
-- * Utilities -- * Utilities
, fieldSettingsLabel , fieldSettingsLabel
, aformM , aformM
, blank , parseHelper
) where ) where
import Yesod.Form.Types import Yesod.Form.Types
@ -391,8 +391,15 @@ aformM action = AForm $ \_ _ ints -> do
value <- action value <- action
return (FormSuccess value, id, ints, mempty) return (FormSuccess value, id, ints, mempty)
blank :: (Monad m, RenderMessage master FormMessage) -- | A helper function for creating custom fields.
=> (Text -> Either FormMessage a) -> [Text] -> m (Either (SomeMessage master) (Maybe a)) --
blank _ [] = return $ Right Nothing -- This is intended to help with the common case where a single input value is
blank _ ("":_) = return $ Right Nothing -- required, such as when parsing a text field.
blank f (x:_) = return $ either (Left . SomeMessage) (Right . Just) $ f x --
-- Since 1.1
parseHelper :: (Monad m, RenderMessage master FormMessage)
=> (Text -> Either FormMessage a)
-> [Text] -> m (Either (SomeMessage master) (Maybe a))
parseHelper _ [] = return $ Right Nothing
parseHelper _ ("":_) = return $ Right Nothing
parseHelper f (x:_) = return $ either (Left . SomeMessage) (Right . Just) $ f x

View File

@ -23,7 +23,7 @@ import Text.Hamlet (shamlet)
import Text.Julius (julius) import Text.Julius (julius)
import Data.Text (Text, pack, unpack) import Data.Text (Text, pack, unpack)
import Data.Monoid (mconcat) import Data.Monoid (mconcat)
import Yesod.Core (RenderMessage, SomeMessage (..)) import Yesod.Core (RenderMessage)
-- | Gets the Google hosted jQuery UI 1.8 CSS file with the given theme. -- | Gets the Google hosted jQuery UI 1.8 CSS file with the given theme.
googleHostedJqueryUiCss :: Text -> Text googleHostedJqueryUiCss :: Text -> Text
@ -58,7 +58,7 @@ class YesodJquery a where
jqueryDayField :: (RenderMessage master FormMessage, YesodJquery master) => JqueryDaySettings -> Field sub master Day jqueryDayField :: (RenderMessage master FormMessage, YesodJquery master) => JqueryDaySettings -> Field sub master Day
jqueryDayField jds = Field jqueryDayField jds = Field
{ fieldParse = blank $ maybe { fieldParse = parseHelper $ maybe
(Left MsgInvalidDay) (Left MsgInvalidDay)
Right Right
. readMay . readMay
@ -102,7 +102,7 @@ $(function(){
jqueryAutocompleteField :: (RenderMessage master FormMessage, YesodJquery master) jqueryAutocompleteField :: (RenderMessage master FormMessage, YesodJquery master)
=> Route master -> Field sub master Text => Route master -> Field sub master Text
jqueryAutocompleteField src = Field jqueryAutocompleteField src = Field
{ fieldParse = blank $ Right { fieldParse = parseHelper $ Right
, fieldView = \theId name attrs val isReq -> do , fieldView = \theId name attrs val isReq -> do
toWidget [shamlet| toWidget [shamlet|
$newline never $newline never