# `HttpDouble.MockEngine`
[🔗](https://github.com/aszymanskiit/http_double/blob/main/lib/http_double/mock_engine.ex#L1)

Evaluation engine for mock and expectation rules.

It is responsible for:

  * matching incoming HTTP requests against configured rules
  * supporting sequence responses (lists) and callback functions
  * tracking usage counts for expectations
  * returning a concrete response specification for the connection layer

# `result`

```elixir
@type result() :: %{
  response: term(),
  rule_id: reference() | nil,
  rules: [HttpDouble.MockRule.t()]
}
```

Result of rule evaluation.

# `apply`

```elixir
@spec apply(
  [HttpDouble.MockRule.t()],
  HttpDouble.Request.t(),
  non_neg_integer(),
  :mock_first | :mock_only | :routes_only,
  (-&gt; {term(), reference() | nil} | {:no_route, term()})
) :: result()
```

Applies mock/expectation rules according to the given mode.

Modes:

  * `:mock_first` – try rules, fall back to `fallback.()` when no match
  * `:mock_only` – try rules, return `{:no_route, default}` when no match
  * `:routes_only` – ignore rules, always call `fallback.()`

---

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