Current section
Files
Jump to
Current section
Files
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