Current section
Files
Jump to
Current section
Files
lib/optimal/schema_helpers.ex
defmodule Ashton.SchemaHelpers do
@moduledoc """
Helpers for building and working with schemas.
"""
@doc """
The schema of the opts for making an Ashton schema.
"""
@spec schema_schema() :: Ashton.Schema.t()
def schema_schema() do
%Ashton.Schema{
opts: [
:opts,
:required,
:defaults,
:extra_keys?,
:custom,
:describe
],
types: [
opts: [{:list, :atom}, :keyword],
required: {:list, :atom},
defaults: :keyword,
extra_keys?: :boolean,
custom: :keyword,
describe: :keyword
],
defaults: [
opts: [],
required: [],
describe: [],
defaults: [],
extra_keys?: false,
custom: []
],
describe: [
opts: "A list of opts accepted, or a keyword of opt name to opt type",
required: "A list of required opts (all of which must be in `opts` as well)",
defaults: "A keyword list of option name to a default value. Values must pass type rules",
extra_keys?: "If enabled, extra keys not specified by the schema do not fail validation",
custom: "A keyword list of option name (for errors) and custom validations. See README",
describe: "A keyword list of option names to short descriptions (like these)"
],
extra_keys?: false,
custom: [
opts: &Ashton.Type.validate_types/4
]
}
end
@doc """
The schema of the opts for merging two ashton schemas
"""
@spec merge_schema() :: Ashton.Schema.t()
def merge_schema() do
%Ashton.Schema{
opts: [
:annotate,
:add_required?
],
types: [
annotate: :string,
add_required?: :boolean
],
defaults: [
add_required?: true
],
describe: [
annotate: "Annotates the source of the opt, to be used in displaying documentation.",
add_required?:
"If true, all required fields from left/right are marked as required. " <>
"Otherwise, only takes required fields from the left."
]
}
end
end