Packages
zoi
0.18.4
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/opts.ex
defmodule Zoi.Opts do
@moduledoc false
## Common Metadata
@spec complex_type_opts() :: Zoi.Type.t()
def complex_type_opts() do
opts =
Zoi.Types.Keyword.new(
[
unrecognized_keys:
Zoi.Types.Union.new(
[
Zoi.Types.Enum.new([:strip, :error, :preserve]),
Zoi.Types.Tuple.new(
{Zoi.Types.Literal.new(:preserve, []),
Zoi.Types.Tuple.new({Zoi.Types.Any.new(), Zoi.Types.Any.new()}, [])},
[]
)
],
description: """
How to handle unrecognized keys:
- `:strip` (default) - removes unrecognized keys
- `:error` - returns error on unrecognized keys
- `:preserve` - keeps unrecognized keys as-is
- `{:preserve, {key_schema, value_schema}}` - preserves and validates both keys and values
"""
),
strict:
Zoi.Types.Boolean.new(
description: "If true, unrecognized keys will cause validation to fail.",
deprecated: "Use :unrecognized_keys option instead."
),
empty_values: empty_values()
],
unrecognized_keys: :error
)
|> with_coerce()
Zoi.Types.Extend.new(opts, meta_opts())
end
@spec meta_opts() :: Zoi.Type.t()
def meta_opts() do
Zoi.Types.Keyword.new(
[
description: description(),
example: example(),
metadata: metadata(),
error: error(),
typespec: typespec(),
deprecated: deprecated()
],
unrecognized_keys: :error
)
end
@spec with_coerce(Zoi.Type.t()) :: Zoi.Type.t()
def with_coerce(schema) do
Zoi.Types.Extend.new(schema, Zoi.Types.Keyword.new([coerce: coerce()], coerce: true))
end
defp error() do
Zoi.Types.String.new(description: "Custom error message for validation.")
end
defp metadata() do
Zoi.Types.Keyword.new(Zoi.Types.Any.new(), description: "Additional metadata for the schema.")
end
defp coerce() do
Zoi.Types.Boolean.new(description: "Enable or disable coercion.")
|> Zoi.Types.Default.new(false)
end
defp description() do
Zoi.Types.String.new(description: "Description of the schema.")
end
defp example() do
Zoi.Types.Any.new(description: "Example value for the schema.")
end
defp typespec() do
Zoi.Types.Macro.new(description: "Custom typespec to override generated type.")
end
defp deprecated() do
Zoi.Types.String.new(description: "Deprecation message to warn when this option is used.")
end
defp empty_values() do
Zoi.Types.Array.new(Zoi.Types.Any.new(),
description: "List of values to treat as empty and skip during parsing."
)
end
## Constraint Helpers
@spec constraint_schema(Zoi.Type.t(), keyword()) :: Zoi.Type.t()
def constraint_schema(internal_schema, opts \\ []) do
custom_opts = Zoi.Types.Keyword.new([error: error()], unrecognized_keys: :error)
Zoi.Types.Union.new(
[
internal_schema,
Zoi.Types.Tuple.new(
{internal_schema, custom_opts},
[]
)
],
opts
)
end
end