Funx.Validator.Any (funx v0.8.2)
View SourceValidates that at least one of several alternative validators succeeds.
Any provides disjunctive validation semantics. Unlike the default validation
pipeline, which is conjunctive (all validators must succeed), Any succeeds
as soon as a single validator passes. If all validators fail, validation fails
with a single aggregated ValidationError.
This validator is useful for expressing alternatives such as: "value must satisfy rule A or rule B".
Options
:validators(required) A non-empty list of validators. Each entry may be:- a validator module implementing
Funx.Validate.Behaviour - a
{Validator, opts}tuple for optioned validators - a validator function with arity 1, 2, or 3 (e.g., result of
validate do...end) - a
{validator_function, opts}tuple for optioned function validators
- a validator module implementing
:message(optional) A zero-arity callback(() -> String.t())used to override the default error message when all alternatives fail.
Semantics
- Validators are evaluated left-to-right.
- Evaluation short-circuits on the first successful validation.
- If any validator returns
Right, the value is returned unchanged. - If all validators return
Left, a singleValidationErroris returned. Nothingvalues succeed if any validator accepts them.Justvalues are unwrapped before validation.
Examples
iex> Funx.Validator.Any.validate(10,
...> validators: [Funx.Validator.Positive, Funx.Validator.Negative]
...> )
%Funx.Monad.Either.Right{right: 10}
iex> Funx.Validator.Any.validate(0,
...> validators: [Funx.Validator.Positive, Funx.Validator.Negative]
...> )
%Funx.Monad.Either.Left{
left: %Funx.Errors.ValidationError{
errors: ["value must satisfy at least one alternative"]
}
}
iex> Funx.Validator.Any.validate(0,
...> validators: [Funx.Validator.Positive, Funx.Validator.Negative],
...> message: fn -> "must be positive or negative" end
...> )
%Funx.Monad.Either.Left{
left: %Funx.Errors.ValidationError{
errors: ["must be positive or negative"]
}
}