# `FrappeUIPhx.Contract`
[🔗](https://github.com/moacirbishopcamata/frappe_ui_phx/blob/v0.3.1/lib/frappe_ui_phx/contract.ex#L1)

Design by Contract para os componentes.

Uma violação de contrato é um bug de quem chama, não fluxo de negócio: por
isso falha alto (`ArgumentError`), em vez de renderizar algo errado em
silêncio. Entrada de usuário (valores de formulário) nunca passa por aqui;
ela vira `errors` do `Phoenix.HTML.FormField`.

  * `require!/3` — pré-condição: o valor pertence ao domínio permitido.
  * `ensure!/2` — pós-condição / invariante: algo que o código garantiu.

# `ensure!`

```elixir
@spec ensure!(term(), String.t()) :: :ok
```

Pós-condição ou invariante: levanta `ArgumentError` com `message` se `condition` for falsa.

# `require!`

```elixir
@spec require!(term(), Enumerable.t(), atom() | String.t()) :: term()
```

Pré-condição: `value` deve estar em `allowed`. Devolve `value`.

---

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