# `PhoenixMicro.Schema.Validator`
[🔗](https://github.com/iamkanishka/phoenix_micro/blob/v1.0.0/lib/phoenix_micro/schema/validator.ex#L1)

Validation engine for `PhoenixMicro.Schema`.

Takes a list of `field_def` tuples `{name, type, opts}` and a raw map,
and returns `{:ok, normalised_map}` or `{:error, [{field, reason}]}`.

This module is called internally by every schema module's generated
`validate/1` callback. You can also call it directly if you have field
definitions at runtime:

    fields = [
      {:amount_cents, :integer, required: true},
      {:currency,    :string,  required: true, default: "USD"}
    ]

    PhoenixMicro.Schema.Validator.validate(fields, %{"amount_cents" => 999})
    # => {:ok, %{"amount_cents" => 999, "currency" => "USD"}}

# `field_def`

```elixir
@type field_def() :: {atom(), PhoenixMicro.Schema.Field.field_type(), keyword()}
```

# `result`

```elixir
@type result() :: {:ok, map()} | {:error, [validation_error()]}
```

# `validation_error`

```elixir
@type validation_error() :: {atom(), String.t()}
```

# `format_errors`

```elixir
@spec format_errors([validation_error()]) :: String.t()
```

Returns a human-readable summary of validation errors.

    PhoenixMicro.Schema.Validator.format_errors([{:amount_cents, "is required"}])
    # => "amount_cents: is required"

# `validate`

```elixir
@spec validate([field_def()], map()) :: result()
```

Validates `payload` against the list of field definitions.

Keys are normalised to strings. Missing required fields produce errors.
Missing optional fields with defaults have defaults applied.

---

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