defmodule ConfluentSchema do
@moduledoc """
Provides cache and validation for confluent schemas.
"""
alias ConfluentSchema.Cache
alias ExJsonSchema.Validator
@type errors :: [{message :: binary, path :: binary}]
@doc """
Validates the payload against the schema for the given subject.
## Examples
iex> ConfluentSchema.validate("a string example", "subject")
{:ok, "a string example"}
iex> ConfluentSchema.validate("a string example", "unknown-subject")
{:error, :not_found}
iex> ConfluentSchema.validate(123, "subject")
{:error, [{"Type mismatch. Expected String but got Integer.", "#"}]}
"""
@spec validate(map, binary) ::
{:ok, map} | {:error, :not_found} | {:error, errors} | no_return
def validate(payload, subject) do
with {:ok, schema} <- Cache.get(subject),
:ok <- Validator.validate(schema, payload) do
{:ok, payload}
end
end
end