# `Isox.Registry`
[🔗](https://github.com/RicardoSantos-99/isox/blob/v0.2.0/lib/isox/registry.ex#L1)

Descobre os módulos `Isox.Generated.<Mensagem>.<Versao>` já
carregados e despacha o parse pela combinação namespace + `MsgDefIdr`
(ADR 0002). Os dois precisam concordar, ou é erro.

# `decode`

```elixir
@spec decode(binary()) ::
  {:ok, module(), term()}
  | {:error, {:unknown_namespace, String.t() | nil}}
  | {:error, {:msg_def_idr_mismatch, expected: String.t(), received: term()}}
  | {:error, String.t()}
```

Acha, entre os módulos gerados carregados, o que declara o `namespace` do
XML; faz o parse com ele e confere que o `MsgDefIdr` recebido é
exatamente o esperado por aquele módulo.

# `generated_modules`

```elixir
@spec generated_modules() :: [module()]
```

Todos os módulos gerados que expõem `namespace/0` (exclui o `Head001`,
que não é mensagem). Lê a lista de módulos da aplicação compilada
(`Application.spec/2`) em vez de `:code.all_loaded/0`, que só enxerga
módulo já referenciado em tempo de execução, e nada aqui garante isso.

# `xml_namespace`

```elixir
@spec xml_namespace(binary()) :: String.t() | nil
```

Namespace do elemento raiz (`xmlns` do `<Envelope>`), sem fazer o parse completo.

---

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