README.md

# Xod

Parsing and schema validation library for Elixir

## Introduction

Xod is a dynamic parsing and schema validation library for Elixir inspired by
the [Typescript library Zod](https://github.com/colinhacks/zod). A schema
refers broadly to a specification used to validate and transform any value, from
a simple number to a complex nested object.

Xod provides a functional API. The default schemata have no side effects and use
only immutable state.

Xod is also extensible. Apart from using the helper schemata provided, one can
implement the `Xod.Schema` protocol to create a fully custom schema.

### Example

```elixir
iex> alias Xod, as: X
iex> my_config = X.map(%{
...>   data: X.map(%{
...>     age: X.number(int: true, ge: 0, lt: 150)
...>   }),
...>   names: X.list(X.string() |> X.max(10))
...> }, key_coerce: true)
iex> X.parse(my_config, %{
...>   "data" => %{
...>     age: -10,
...>   },
...>   names: ["John", "Peter", "Chandragupta"]
...> })
{:error,
 %Xod.XodError{issues: [
  [type: :too_small,
   path: [:data, :age],
   message: "Number must be greater than or equal to 0",
   data: [min: 0]
  ],
  [type: :too_big,
   path: [:names, 2],
   message: "String must contain at most 10 character(s)",
   data: [max: 10]
  ]
]}}
```

## Alternatives

### NimbleOptions

<https://github.com/dashbitco/nimble_options>

Very popular library. Validates options defined as keyword lists.

### Optimal

<https://github.com/albert-io/optimal>

Similar to NimbleOptions. Only useful on opts defined as keyword lists.

### Parameter

<https://github.com/phcurado/parameter>

Schema creation, validation with serialization and deserialization.
Works with maps by defining parameters on modules using macros.

### Xema

<https://github.com/hrzndhrn/xema>

Schema validator. Very similar to this project but inspired by JSON schema.

## License

This software is licensed under
[the MIT license](https://github.com/ernestoittig/xod/blob/main/LICENSE).