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