# `IMDS.Providers`

The registry of the provider implementations.

The order of `all/0` is the probe order of `IMDS.detect/1`.

# `all`

```elixir
@spec all() :: [{IMDS.Provider.provider(), module()}]
```

Return the provider identifiers and their modules, in probe order.

# `names`

```elixir
@spec names() :: [IMDS.Provider.provider()]
```

Return the provider identifiers, in probe order.

# `resolve`

```elixir
@spec resolve(IMDS.Provider.provider() | module() | binary()) ::
  {:ok, module()} | {:error, {:unknown_provider, term()}}
```

Return the module of a provider name, or accept a module itself.

The name can be an atom or a binary. A module MUST export every callback of
`IMDS.Provider`.

## Examples

    iex> IMDS.Providers.resolve(:gce)
    {:ok, IMDS.Providers.GCE}

    iex> IMDS.Providers.resolve("gce")
    {:ok, IMDS.Providers.GCE}

    iex> IMDS.Providers.resolve(:nope)
    {:error, {:unknown_provider, :nope}}

---

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