Packages
jsv
0.21.2
0.21.2
0.21.1
0.21.0
0.20.0
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.3
0.18.2
0.18.1
0.18.0
0.17.1
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.1
0.13.0
0.12.0
0.11.5
0.11.4
0.11.3
retired
0.11.2
0.11.1
0.11.0
0.10.1
0.10.0
0.9.0
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.0
0.5.1
0.5.0
0.4.0
0.3.0
0.2.0
0.1.0
A JSON Schema Validator with complete support for the latest specifications.
Current section
Files
Jump to
Current section
Files
lib/jsv/schema/helpers_compiler.ex
defmodule JSV.Schema.HelpersCompiler do
@moduledoc false
defmacro defpreset(fun, args) do
props_doc = listify_props_docs(args)
quote do
doc_custom =
case Module.get_attribute(__MODULE__, :doc) do
{_, text} when is_binary(text) -> "\n\n#{text}"
_ -> ""
end
@doc "Returns a JSON Schema with #{unquote(props_doc)}.#{doc_custom}"
@doc group: "Schema Presets"
@spec unquote(fun)(JSV.Schema.attributes() | nil) :: JSV.Schema.schema()
def unquote(fun)(extra \\ nil) do
JSV.Schema.combine(extra, unquote(args))
end
end
end
defmacro defcompose(fun, args) do
props_doc = listify_props_docs(args)
quote do
doc_custom =
case Module.get_attribute(__MODULE__, :doc) do
{_, text} when is_binary(text) -> "\n\n#{text}"
_ -> ""
end
@doc "Defines or merges onto a JSON Schema with #{unquote(props_doc)}.#{doc_custom}"
@spec unquote(fun)(JSV.Schema.merge_base()) :: JSV.Schema.schema()
def unquote(fun)(merge_base \\ nil) do
JSV.Schema.merge(merge_base, unquote(args))
end
end
end
defp listify_props_docs(props) do
props
|> Enum.map(fn {k, v} -> "`#{k}: #{Macro.to_string(v)}`" end)
|> :lists.reverse()
|> case do
[last | [_ | _] = prev] ->
prev
|> Enum.intersperse(", ")
|> :lists.reverse([" and ", last])
[single] ->
[single]
end
end
end