Packages
zoi
0.8.3
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/struct.ex
defmodule Zoi.Types.Struct do
@moduledoc false
use Zoi.Type.Def, fields: [:module, :fields, :keys, :inner, :strict, :coerce]
def new(module, fields, opts) when is_map(fields) or is_list(fields) do
fields =
fields
|> Enum.map(fn {key, type} ->
if type.meta.required == nil do
{key, Zoi.required(type)}
else
{key, type}
end
end)
inner =
fields
|> Zoi.keyword(opts)
|> Zoi.to_struct(module)
keys = Enum.map(fields, fn {key, _type} -> key end)
if Enum.any?(keys, &(!is_atom(&1))) do
raise ArgumentError, "all keys in struct must be atoms"
end
opts =
Keyword.merge([error: "invalid type: must be a struct", strict: false, coerce: false], opts)
apply_type(opts ++ [module: module, fields: fields, keys: keys, inner: inner])
end
def new(_module, _fields, _opts) do
raise ArgumentError, "struct must receive a map"
end
defimpl Zoi.Type do
def parse(%Zoi.Types.Struct{inner: inner, module: module}, %module{} = input, opts) do
input =
Map.from_struct(input)
|> Map.to_list()
Zoi.parse(inner, input, opts)
end
def parse(%Zoi.Types.Struct{inner: inner, coerce: true}, input, opts) when is_map(input) do
Zoi.parse(inner, Map.to_list(input), opts)
end
def parse(schema, _, _) do
{:error, schema.meta.error}
end
def type_spec(%Zoi.Types.Struct{module: module, fields: fields}, opts) do
fields
|> Enum.map(fn {key, type} ->
{key, Zoi.Type.type_spec(type, opts), type}
end)
|> Enum.map(fn {key, type_spec, _type} ->
quote do: {unquote(key), unquote(type_spec)}
end)
|> then("e(do: %unquote(module){unquote_splicing(&1)}))
end
end
defimpl Inspect do
def inspect(type, opts) do
Zoi.Inspect.inspect_type(type, opts)
end
end
end