aboutsummaryrefslogtreecommitdiff
path: root/src/client/Validation.elm
blob: de279636cb718b8ab770eaa40eef2eb57fb08304 (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
62
63
64
65
module Validation exposing
  ( cost
  , date
  , category
  , color
  , new
  )

import Date exposing (Date)
import Date.Extra.Core exposing (intToMonth)
import Date.Extra.Create exposing (dateFromFields)
import Dict
import Regex
import String exposing (toInt, split)

import Form.Validate as Validate exposing (Validation)
import Form.Error as Error exposing (ErrorValue(CustomError))

import Model.Category exposing (Categories, CategoryId)

cost : Validation String Int
cost =
  Validate.customValidation Validate.int (\n ->
    if n == 0
      then Err (Validate.customError "CostMustNotBeNull")
      else Ok n
  )

date : Validation String Date
date =
  Validate.customValidation Validate.string (\str ->
    case split "/" str of
      [day, month, year] ->
        case (toInt day, toInt month, toInt year) of
          (Ok dayNum, Ok monthNum, Ok yearNum) ->
            Ok (dateFromFields yearNum (intToMonth monthNum) dayNum 0 0 0 0)
          _ -> Err (Validate.customError "InvalidDate")
      _ -> Err (Validate.customError "InvalidDate")
  )

category : Categories -> Validation String CategoryId
category categories =
  Validate.customValidation Validate.string (\str ->
    case toInt str of
      Ok category ->
        if List.member category (Dict.keys categories)
          then Ok category
          else Err (Validate.customError "InvalidCategory")
      Err _ ->
        Err (Validate.customError "InvalidCategory")
  )

color : Validation String String
color =
  Validate.customValidation Validate.string (\str ->
    if Regex.contains (Regex.regex "^#[0-9a-fA-F]{6}$") str
      then Ok str
      else Err (Validate.customError "InvalidColor")
  )

new : List x -> x -> Validation String x
new xs x field =
  if List.member x xs
    then Err (Error.value <| CustomError "AlreadyExists")
    else Ok x