# `Nfse.Error`
[🔗](https://github.com/ideia4it/nfse/blob/v0.1.0/lib/nfse/error.ex#L1)

Erro devolvido por toda função pública da biblioteca.

`messages` é uma lista de `t:message/0`. A Sefin manda `erros[]` na emissão e um `erro` único
nos eventos, e os dois viram essa lista. `details` carrega o dado específico de cada `kind`, e
`dps_id` identifica a DPS de uma escrita para conferir o resultado em vez de reenviar.

| `kind` | Quando |
|---|---|
| `:validation` | o documento não passa no schema; `details` traz os caminhos; sem rede |
| `:certificate` | certificado vencido, sem *clientAuth* ou ilegível; sem rede |
| `:rejected` | 400: regra de negócio (código `E....` do Anexo I ou II) |
| `:forbidden` | 403: certificado recusado ou ator sem acesso ao documento |
| `:not_found` | 404 |
| `:server` | 5xx |
| `:timeout`, `:transport` | sem resposta; numa escrita, o resultado é incerto |
| `:unexpected` | resposta que não se consegue ler; com `status` 2xx, numa escrita, o resultado é incerto |

# `kind`

```elixir
@type kind() ::
  :validation
  | :certificate
  | :rejected
  | :forbidden
  | :not_found
  | :server
  | :timeout
  | :transport
  | :unexpected
```

# `message`

```elixir
@type message() :: %{
  code: String.t() | nil,
  description: String.t() | nil,
  complement: String.t() | nil
}
```

# `t`

```elixir
@type t() :: %Nfse.Error{
  __exception__: true,
  details: term(),
  dps_id: String.t() | nil,
  kind: kind() | nil,
  messages: [message()],
  status: non_neg_integer() | nil
}
```

---

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