Funx.Validator.AllEqual (funx v0.8.0)
View SourceValidates that all elements in a list are equal to each other.
Maybe Support
This validator supports Maybe types from Prism projections:
Nothing- Passes validation (optional fields without values)Just(list)- Validates the list inside the Just
This makes the validator compatible with optional fields in the validation DSL.
Optional Options
:message- Custom error message callback(value -> String.t()):eq- Custom equality comparator (defaults toFunx.Eq.Protocol)
Examples
iex> Funx.Validator.AllEqual.validate([1, 1, 1], [])
%Funx.Monad.Either.Right{right: [1, 1, 1]}
iex> Funx.Validator.AllEqual.validate([1, 2, 3], [])
%Funx.Monad.Either.Left{left: %Funx.Errors.ValidationError{errors: ["must be all matching"]}}
iex> Funx.Validator.AllEqual.validate("not a list", [])
%Funx.Monad.Either.Left{left: %Funx.Errors.ValidationError{errors: ["must be a list"]}}
iex> Funx.Validator.AllEqual.validate([1, 2], [message: fn _ -> "all items must match" end])
%Funx.Monad.Either.Left{left: %Funx.Errors.ValidationError{errors: ["all items must match"]}}Using Custom Equality
You can provide a custom equality comparator via the :eq option:
iex> case_insensitive = %{
...> eq?: fn a, b -> String.downcase(a) == String.downcase(b) end,
...> not_eq?: fn a, b -> String.downcase(a) != String.downcase(b) end
...> }
iex> Funx.Validator.AllEqual.validate(["HELLO", "hello", "HeLLo"], [eq: case_insensitive])
%Funx.Monad.Either.Right{right: ["HELLO", "hello", "HeLLo"]}Maybe Examples
iex> Funx.Validator.AllEqual.validate(%Funx.Monad.Maybe.Nothing{}, [])
%Funx.Monad.Either.Right{right: %Funx.Monad.Maybe.Nothing{}}
iex> Funx.Validator.AllEqual.validate(%Funx.Monad.Maybe.Just{value: [1, 1, 1]}, [])
%Funx.Monad.Either.Right{right: [1, 1, 1]}
iex> Funx.Validator.AllEqual.validate(%Funx.Monad.Maybe.Just{value: [1, 2]}, [])
%Funx.Monad.Either.Left{left: %Funx.Errors.ValidationError{errors: ["must be all matching"]}}