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)