# `ASM.Extensions.Routing.Strategy`
[🔗](https://github.com/nshkrdotcom/agent_session_manager/blob/v0.9.2/lib/asm/extensions/routing/strategy.ex#L1)

Selection strategy contract for routing provider candidates.

# `candidate`

```elixir
@type candidate() :: %{
  id: term(),
  provider: atom(),
  provider_opts: keyword(),
  priority: integer(),
  weight: pos_integer(),
  position: non_neg_integer()
}
```

Router candidate metadata presented to strategies.

# `state`

```elixir
@type state() :: term()
```

Opaque strategy state.

# `choose`

```elixir
@callback choose([candidate()], state(), keyword()) ::
  {:ok, candidate(), state()} | :none | {:error, ASM.Error.t()}
```

# `init`

```elixir
@callback init(keyword()) :: {:ok, state()} | {:error, ASM.Error.t()}
```

---

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