# `Backplane.JsonSchema.Validator`

Executes compiled `Schema` rules against data, accumulating errors and tracking
evaluated keys for `unevaluatedProperties`/`unevaluatedItems`.

During validation, a context tuple is threaded through each rule:

    {path, evaluated_keys, validation_context}

- `path` — Reversed list of JSON Pointer segments (e.g., `["email", 0, "users"]`)
- `evaluated_keys` — `MapSet` of property names or array indices validated so far
- `validation_context` — `ValidationContext` struct referencing the root schema

## Examples

    iex> {:ok, schema} = Backplane.JsonSchema.compile(%{"type" => "object", "properties" => %{"name" => %{"type" => "string"}}})
    iex> Backplane.JsonSchema.Validator.validate(schema, %{"name" => "Alice"})
    :ok

# `validate`

```elixir
@spec validate(Backplane.JsonSchema.Types.Schema.t(), term()) ::
  :ok | {:error, [Backplane.JsonSchema.Types.Error.t()]}
```

Validates data against a compiled schema.

Regex engine errors abort validation with an `:indeterminate_pattern` error.
They are not ordinary schema mismatches and cannot be inverted or suppressed
by subschema combinators.

## Examples

    iex> {:ok, schema} = Backplane.JsonSchema.compile(%{"type" => "integer", "minimum" => 0})
    iex> Backplane.JsonSchema.Validator.validate(schema, 10)
    :ok

    iex> {:ok, schema} = Backplane.JsonSchema.compile(%{"type" => "integer", "minimum" => 0})
    iex> {:error, errors} = Backplane.JsonSchema.Validator.validate(schema, -5)
    iex> Enum.any?(errors, fn e -> e.rule == :minimum end)
    true

# `validate_entry`

```elixir
@spec validate_entry(
  Backplane.JsonSchema.Types.Schema.t(),
  term(),
  list(),
  Backplane.JsonSchema.Types.ValidationContext.t(),
  term()
) :: {:ok, MapSet.t()} | {:error, validation_error_list()}
```

Recursive validation engine called by the rule dispatcher.

Executes all rules in the schema sequentially, accumulating errors and evaluated keys.

## Examples

    iex> {:ok, schema} = Backplane.JsonSchema.compile(%{"type" => "string"})
    iex> ctx = %Backplane.JsonSchema.Types.ValidationContext{root_schema: schema, scope_stack: [], source_id: nil, raw: nil}
    iex> Backplane.JsonSchema.Validator.validate_entry(schema, "hello", [], ctx)
    {:ok, MapSet.new()}

---

*Consult [api-reference.md](api-reference.md) for complete listing*
