# `JSV.FormatValidator`
[🔗](https://github.com/lud/jsv/blob/v0.18.3/lib/jsv/format_validator.ex#L1)

Behaviour for format validator implementations.

Such implementations must be given to `JSV.build/2` in the `:formats` option:

    JSV.build!(raw_schema,
      resolver: resolver,
      formats: [MyModule | JSV.default_format_validator_modules()]
    )

Each given module is interrogated for format support when a schema is built.
Modules earlier in the list take precedence and if a format is found in the
returned value of the `c:supported_formats/0` callback, the module is selected
for compilation and no other module will be tried.

A module can declare multiple formats.

# `format`

```elixir
@type format() :: String.t()
```

# `applies_to_type?`

```elixir
@callback applies_to_type?(format(), data :: term()) :: boolean()
```

Returns `true` if the given format should be used for the input data type.

For instance, the `"date"` format will not be validated if the input data is
not a string.

No validation should be done in this callback, only the _type_ of the data
should be considered.

# `supported_formats`

```elixir
@callback supported_formats() :: [format()]
```

Returns the list of the supported formats, as strings.

# `validate_cast`

```elixir
@callback validate_cast(format(), data :: term()) :: {:ok, term()} | {:error, term()}
```

Receives the schema format as string, and the data.

Returns a result tuple with data optionally casted to a more meaningful data
structure (for instance returning a `Date` struct instead of the string
representation of the date).

---

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