Yet another Elixir data validation engine library.
Main goals: light and succintly.
Ve is going to be used (as is) in production. PR of improvements or issues are welcome.
The package can be installed by adding ve to your list of dependencies in mix.exs:
def deps do
[
{:ve, "~> 0.1"}
]
endSome trivial examples for usage.
# NULLABLE
"foo" |> Ve.validate([:string, :nullable])
{:ok, "foo"}
nil |> Ve.validate([:string, :nullable])
{:ok, "foo"}
# IN a set of possible values
"foo" |> Ve.validate([:string, in: ["foo", "bar"]])
{:ok, "foo"}
"xxx" |> Ve.validate([:string, in: ["foo", "bar"]])
{:error, ["invalid_possible_value"]}
# fixed VALUE
"bar" |> Ve.validate([:string, value: "bar"])
{:ok, "bar"}
"foo" |> Ve.validate([:string, value: "bar"])
{:error, ["invalid_fixed_value"]}
true |> Ve.validate([:boolean, value: true])
{:ok, true}
false |> Ve.validate([:boolean, value: true])
{:error, ["invalid_fixed_value"]}"foo" |> Ve.validate([:any, in: ["foo", 42]])
{:ok, "foo"}
42 |> Ve.validate([:any, in: ["some data", 42]])
{:ok, 42}"foo" |> Ve.validate([:string])
{:ok, "foo"}
123 |> Ve.validate([:string])
{:error, ["string_expected_got_integer"]}
"my data" |> Ve.validate([:string, pattern: ~r/data/])
{:ok, "my data"}
"test" |> Ve.validate([:string, :not_empty])
{:ok, "test"}
"" |> Ve.validate([:string, :not_empty])
{:error, ["string_cannot_be_empty"]}
" \t \t" |> Ve.validate([:string, :not_empty])
{:error, ["string_cannot_be_empty"]}123 |> Ve.validate([:integer])
{:ok, 123}
123 |> Ve.validate([:integer, min: 120, max: 130])
{:ok, 123}["a"] |> Ve.validate([:list])
{:ok, ["a"]}
["a"] |> Ve.validate([:list, of: [:string]])
{:ok, ["a"]}
[123, "a"] |> Ve.validate([:list, of: [:integer]])
{:error, ["integer_expected_got_bitstring"]}%{name: "foo"} |> Ve.validate([:map, fields: [name: [:string]]])
{:ok, %{name: "foo"}}
%{name: "foo"} |> Ve.validate([:map, fields: [name: [:string], surname: [:string, :optional]]])
{:ok, %{name: "foo"}}
%{name: "foo", surname: nil} |> Ve.validate([:map, fields: [name: [:string], surname: [:string, :nullable]]])
{:ok, %{name: "foo", surname: nil}}
%{name: "foo", surname: "foo"} |> Ve.validate([:map, xor: [name: [:string], surname: [:string]]])
{:error, ["just_one_field_must_be_present"]}{"a", 9} |> Ve.validate([:tuple, of: [[:string], [:integer, max: 10]]])
{:ok, {"a", 9}}