OCaml input validation collecting field errors
OCaml
type user = { name : string; email : string; age : int }
type error = { field : string; message : string }
let validate user =
let check field ok message errors =
if ok then errors else { field; message } :: errors
in
[]
|> check "name" (String.trim user.name <> "") "must not be empty"
|> check "email" (String.contains user.email '@' && String.length user.email > 3) "must look like an email"
|> check "age" (user.age >= 18 && user.age <= 130) "must be between 18 and 130"
|> List.rev
let parse ~name ~email ~age =
match int_of_string_opt age with
| None -> Error [ { field = "age"; message = "must be an integer" } ]
| Some age -> (
match validate { name; email; age } with
| [] -> Ok (name, email, age)
| errors -> Error errors)