# `Nfse.Schema.SimpleType`
[🔗](https://github.com/ideia4it/nfse/blob/v0.1.0/lib/nfse/schema/simple_type.ex#L1)

Uso interno da biblioteca: não faz parte da API pública.

Valor de um tipo simples do XSD: conversão, validação, escrita e leitura.

As regras vêm do módulo de tipos simples do schema, que responde `facets/1` com as facetas já
achatadas (as da base primeiro, depois as do próprio tipo) e `kind/1` com a representação em
Elixir. Os detalhes e as divergências em relação ao XSD estão em `Nfse.Schema.Runtime`.

# `error`

```elixir
@type error() ::
  :type
  | :length
  | :min_length
  | :max_length
  | :enumeration
  | :pattern
  | :integer_digits
  | :fraction_digits
```

# `kind`

```elixir
@type kind() :: :string | :date | :datetime | {:decimal, pos_integer(), pos_integer()}
```

# `cast`

```elixir
@spec cast(module(), String.t(), term()) :: term()
```

Converte o valor de entrada para a representação canônica do tipo.

Inteiro vira string num tipo `:string`, e decimal válido passa a ter exatamente as casas do tipo.
Qualquer outro valor volta como veio, para que `validate/3` aponte o erro.

# `parse`

```elixir
@spec parse(module(), String.t(), String.t()) :: {:ok, term()} | {:error, error()}
```

Lê o texto de um elemento ou atributo. As facetas são conferidas no texto antes de qualquer
conversão, para que um decimal com expoente nunca chegue ao `Decimal`.

# `to_lexical`

```elixir
@spec to_lexical(module(), String.t(), term()) :: String.t()
```

Devolve a forma escrita do valor, sem escaping.

Levanta `ArgumentError` para um valor do tipo errado ou um decimal com dígitos demais, porque
escrevê-lo exigiria arredondar ou truncar.

# `validate`

```elixir
@spec validate(module(), String.t(), term()) :: :ok | {:error, error()}
```

Confere o tipo, os dígitos de um decimal e cada faceta sobre a forma escrita do valor.

---

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