Current section

Files

Jump to
nex_json_schema lib ex_json_schema validator items.ex
Raw

lib/ex_json_schema/validator/items.ex

defmodule NExJsonSchema.Validator.Items do
alias NExJsonSchema.Schema
alias NExJsonSchema.Validator
@spec validate(Root.t(), Schema.resolved(), [NExJsonSchema.data()]) :: Validator.errors_with_list_paths()
def validate(root, %{"items" => schema = %{}}, items) when is_list(items) do
items
|> Enum.with_index()
|> Enum.flat_map(fn {item, index} ->
Validator.validate(root, schema, item, ["[#{index}]"])
end)
end
@spec validate(Root.t(), Schema.resolved(), [NExJsonSchema.data()]) :: Validator.errors_with_list_paths()
def validate(root, %{"items" => schemata, "additionalItems" => additional_items}, items)
when is_list(items) and is_list(schemata) do
items
|> Enum.with_index()
|> Enum.flat_map(fn {item, index} ->
schema = Enum.at(schemata, index, additional_items_schema(additional_items))
validate_item(root, schema, item, index)
end)
end
@spec validate(Root.t(), Schema.resolved(), NExJsonSchema.data()) :: []
def validate(_, _, _), do: []
defp validate_item(_, nil, _, index) do
[
{%{
description: "schema does not allow additional items",
rule: :schema,
params: []
}, ["[#{index}]"]}
]
end
defp validate_item(root, schema, item, index) do
Validator.validate(root, schema, item, ["[#{index}]"])
end
defp additional_items_schema(schema = %{}), do: schema
defp additional_items_schema(true), do: %{}
defp additional_items_schema(_), do: nil
end