lib/ex_json_schema/validator/unique_items.ex

defmodule ExJsonSchema.Validator.UniqueItems do
  @moduledoc """
  `ExJsonSchema.Validator` implementation for `"uniqueItems"` attributes.

  See:
  https://tools.ietf.org/html/draft-fge-json-schema-validation-00#section-5.3.4
  https://tools.ietf.org/html/draft-wright-json-schema-validation-01#section-6.13
  https://tools.ietf.org/html/draft-handrews-json-schema-validation-01#section-6.4.5
  """

  alias ExJsonSchema.Validator.Error

  @behaviour ExJsonSchema.Validator

  @impl ExJsonSchema.Validator
  def validate(_, _, {"uniqueItems", unique_items}, data, _) do
    do_validate(unique_items, data)
  end

  def validate(_, _, _, _, _) do
    []
  end

  defp do_validate(true, items) when is_list(items) do
    unique? =
      items
      |> Enum.uniq()
      |> Enum.count()
      |> Kernel.==(Enum.count(items))

    if unique? do
      []
    else
      [%Error{error: %Error.UniqueItems{}}]
    end
  end

  defp do_validate(_, _) do
    []
  end
end