Legend:
Library
Module
Module type
Parameter
Class
Class type
A module for organizing validations of data structures.
Allows standardized ways of checking for conditions, and keeps track of the location of errors by keeping a path to each error found. Thus, if you were validating the following datastructure:
{ foo = 3;
bar = { snoo = 34.5;
blue = Snoot -6; }
}
One might end up with an error with the error path:
bar.blue.Snoot : value -6 <= bound 0
By convention, the validations for a type defined in module M appear in module M, and have their name prefixed by validate_. E.g., Int.validate_positive.
Here's an example of how you would use validate with a record:
type t =
{ foo: int;
bar: float;
}
[@@deriving_inline fields][@@@end]
let validate t =
let module V = Validate in
let w check = V.field_folder t check in
V.of_list
(Fields.fold ~init:[]
~foo:(w Int.validate_positive)
~bar:(w Float.validate_non_negative)
)
And here's an example of how you would use it with a variant type:
type t =
| Foo of int
| Bar of (float * int)
| Snoo of Floogle.t
let validate = function
| Foo i -> V.name "Foo" (Int.validate_positive i)
| Bar p -> V.name "Bar" (V.pair
~fst:Float.validate_positive
~snd:Int.validate_non_negative p)
| Snoo floogle -> V.name "Snoo" (Floogle.validate floogle)
type t
The result of a validation. This effectively contains the list of errors, qualified by their location path
fail_fn err returns a function that always returns fail, with err as the error message. (Note that there is no pass_fn so as to discourage people from ignoring the type of the value being passed unconditionally irrespective of type.)