Packages
A JSON Schema validator with full support for the draft 4 specification and zero dependencies.
Current section
Files
Jump to
Current section
Files
lib/ex_json_schema/validator/items.ex
defmodule ExJsonSchema.Validator.Items do
alias ExJsonSchema.Schema
alias ExJsonSchema.Validator
@spec validate(Root.t, Schema.resolved, [ExJsonSchema.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, [ExJsonSchema.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, ExJsonSchema.data) :: []
def validate(_, _, _), do: []
defp validate_item(_, nil, _, index) do
[{"Schema does not allow additional items.", [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