blob: 9c21e14fd169efd229f4aaad29bfce10336a5bb6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
module Common.Validation.Atomic
( color
, day
, minLength
, nonEmpty
, nonNullNumber
, number
, password
) where
import qualified Data.Char as Char
import Data.Text (Text)
import qualified Data.Text as T
import Data.Time.Calendar (Day)
import Data.Validation (Validation)
import qualified Data.Validation as V
import qualified Text.Read as T
import qualified Common.Msg as Msg
import qualified Common.Util.Time as Time
minLength :: Int -> Text -> Validation Text Text
minLength l =
V.validate
(Msg.get (Msg.Form_MinChars l))
(\t -> if T.length t >= l then Just t else Nothing)
nonEmpty :: Text -> Validation Text Text
nonEmpty =
V.validate
(Msg.get Msg.Form_NonEmpty)
(\t -> if (not . T.null $ t) then Just t else Nothing)
number :: Text -> Validation Text Int
number input =
case (T.readMaybe . T.unpack $ input) of
Just n -> V.Success n
_ -> V.Failure (Msg.get Msg.Form_InvalidInt)
nonNullNumber :: Int -> Validation Text Int
nonNullNumber =
V.validate
(Msg.get Msg.Form_NonNullNumber)
(\n -> if n /= 0 then Just n else Nothing)
day :: Text -> Validation Text Day
day str =
case Time.parseDay str of
Just d -> V.Success d
Nothing -> V.Failure $ Msg.get Msg.Form_InvalidDate
color :: Text -> Validation Text Text
color str =
if T.take 1 str == "#" && T.all Char.isHexDigit (T.drop 1 str) then
V.Success str
else
V.Failure (Msg.get Msg.Form_InvalidColor)
password :: Text -> Validation Text Text
password = minLength 8
|