Packages
zoi
0.9.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.1
0.16.0
0.15.0
0.14.1
0.14.0
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.1
0.9.0
0.9.0-rc.1
0.9.0-rc.0
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Zoi is a schema validation library for Elixir, designed to provide a simple and flexible way to define and validate data.
Current section
Files
Jump to
Current section
Files
lib/zoi/type.ex
defprotocol Zoi.Type do
@moduledoc ~S"""
Protocol for defining types in Zoi.
Types are used to validate and parse data according to a defined schema.
You can implement this protocol for custom types to handle specific validation and parsing logic.
## Example
To create a custom type, you can define a module and implement the `Zoi.Type` protocol:
defmodule StringBoolean do
use Zoi.Type.Def
# `apply_type/1` is a helper function that will create the struct with the given options.
def string_bool(opts \\ []) do
apply_type(opts)
end
defimpl Zoi.Type do
# This function is called to parse the input according to the schema.
def parse(_schema, input, _opts) when is_binary(input) do
{:ok, input}
end
def parse(_schema, input, _opts) when is_boolean(input) do
{:ok, input}
end
def parse(_schema, _input, _opts) do
{:error, "invalid string or boolean type"}
end
def type_spec(_schema, _opts) do
quote do
boolean() | binary()
end
end
end
end
You can then use this type in your schema definitions and it will handle parsing and validation as defined.
iex> schema = StringBoolean.string_bool()
iex> Zoi.parse(schema, "hello world")
{:ok, "hello world"}
iex> Zoi.parse(schema, true)
{:ok, true}
iex> Zoi.parse(schema, 123)
{:error,
[
%Zoi.Error{
code: :custom,
issue: {"invalid string or boolean type", []},
message: "invalid string or boolean type",
path: []
}
]}
In general, you will not need to implement this protocol directly. `Zoi` provides a functional API with a good set of built-in types that cover most use cases.
For example, you can implement the `string_bool/1` function above using `Zoi.union/2` with `Zoi.string/1` and `Zoi.boolean/1` types.
iex> schema = Zoi.union([Zoi.string(), Zoi.boolean()])
iex> Zoi.parse(schema, "hello world")
{:ok, "hello world"}
iex> Zoi.parse(schema, true)
Or use the `Zoi.string_boolean/1` function, which already covers this and more complex use cases.
"""
def parse(schema, input, opts)
def type_spec(schema, opts)
end