Packages
zoi
0.12.1
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/types/map.ex
defmodule Zoi.Types.Map do
@moduledoc false
use Zoi.Type.Def, fields: [:key_type, :value_type]
def opts() do
Zoi.Opts.meta_opts()
end
def new(key_type, value_type, opts) do
apply_type(Keyword.merge(opts, key_type: key_type, value_type: value_type))
end
defimpl Zoi.Type do
def parse(%Zoi.Types.Map{} = schema, input, _opts) when is_map(input) do
Enum.reduce(input, {%{}, []}, fn {key, value}, {input, errors} ->
with {:ok, key_parsed} <- Zoi.parse(schema.key_type, key),
{:ok, value_parsed} <- Zoi.parse(schema.value_type, value) do
{Map.put(input, key_parsed, value_parsed), errors}
else
{:error, err} ->
error = Enum.map(err, &Zoi.Error.prepend_path(&1, [key]))
{input, Zoi.Errors.merge(errors, error)}
end
end)
|> then(fn {parsed, errors} ->
if errors == [] do
{:ok, parsed}
else
{:error, errors, parsed}
end
end)
end
def parse(schema, _, _) do
{:error, Zoi.Error.invalid_type(:map, error: schema.meta.error)}
end
def type_spec(%Zoi.Types.Map{key_type: key_type, value_type: value_type}, opts) do
key_spec = Zoi.Type.type_spec(key_type, opts)
value_spec = Zoi.Type.type_spec(value_type, opts)
# If key and value are any type, we use map() (any map)
if key_type == Zoi.any() and value_type == Zoi.any() do
quote do
map()
end
else
quote do
%{optional(unquote(key_spec)) => unquote(value_spec)}
end
end
end
end
defimpl Inspect do
def inspect(type, opts) do
extra_fields = [
key: Inspect.inspect(type.key_type, opts),
value: Inspect.inspect(type.value_type, opts)
]
Zoi.Inspect.build(type, opts, extra_fields)
end
end
defimpl Zoi.JSONSchema.Encoder do
def encode(_schema), do: %{type: :object}
end
end