@@ -2,7 +2,7 @@ module Lumi.Components.Form.Validation
22 ( Validator
33 , nonEmpty , nonEmptyArray , nonNull
44 , mustEqual , mustBe
5- , validNumber , validInt
5+ , validNumber , validInt , validDate
66 , optional
77 , Validated (..)
88 , _Validated , _Fresh , _Modified
@@ -18,7 +18,9 @@ import Prelude
1818import Data.Array as Array
1919import Data.Array.NonEmpty (NonEmptyArray )
2020import Data.Array.NonEmpty (fromArray ) as NEA
21+ import Data.Date as Date
2122import Data.Either (Either (..), either , hush , note )
23+ import Data.Enum (toEnum )
2224import Data.Eq (class Eq1 )
2325import Data.Foldable (foldMap )
2426import Data.Int as Int
@@ -29,8 +31,11 @@ import Data.Newtype (un)
2931import Data.Nullable (notNull )
3032import Data.Number as Number
3133import Data.Ord (class Ord1 )
34+ import Data.String.Common (split )
3235import Data.String.NonEmpty (NonEmptyString )
3336import Data.String.NonEmpty (fromString ) as NES
37+ import Data.String.Pattern (Pattern (..))
38+ import Data.Traversable (traverse )
3439import Heterogeneous.Mapping (class HMap , class MapRecordWithIndex , class Mapping , ConstMapping , hmap , mapping )
3540import Lumi.Components.Column (column_ )
3641import Lumi.Components.Form.Internal (Forest , FormBuilder (..), Tree (..))
@@ -81,6 +86,16 @@ validNumber name = note (name <> " must be a number.") <<< Number.fromString
8186validInt :: String -> Validator String Int
8287validInt name = note (name <> " must be a whole number." ) <<< Int .fromString
8388
89+ -- | A `Validator` which verifies that its input can be parsed as a date.
90+ -- | Dates are of the format "YYYY-MM-DD".
91+ validDate :: String -> Validator String Date.Date
92+ validDate name input =
93+ note (name <> " must be a date." ) result
94+ where
95+ result = case traverse Int .fromString $ split (Pattern " -" ) input of
96+ Just [y, m, d] -> join $ Date .exactDate <$> toEnum y <*> toEnum m <*> toEnum d
97+ _ -> Nothing
98+
8499-- | Modify a `Validator` to accept empty strings in addition to anything it
85100-- | already accepts. The empty string is mapped to `Nothing`, and any other
86101-- | valid input is mapped to `Just` the result of the original validator.
0 commit comments