# `Supabase.Fetcher.Adapter`

Behaviour that defines the interface to implement different HTTP clients
as backends for the `Supabase.Fetcher` request builder.

# `request_opts`

```elixir
@type request_opts() :: keyword()
```

# `response`

```elixir
@type response() :: Supabase.Fetcher.response()
```

# `request`

```elixir
@callback request(Supabase.Fetcher.Request.t(), request_opts()) ::
  {:ok, response()} | {:error, term()}
```

# `request_async`
*optional* 

```elixir
@callback request_async(Supabase.Fetcher.Request.t(), request_opts()) ::
  {:ok, response()} | {:error, term()}
```

# `stream`
*optional* 

```elixir
@callback stream(Supabase.Fetcher.Request.t(), request_opts()) ::
  {:ok, response()} | {:error, term()}
```

# `stream`
*optional* 

```elixir
@callback stream(Supabase.Fetcher.Request.t(), on_response, request_opts()) ::
  {:ok, response()} | {:error, term()}
when on_response: ({Supabase.Fetcher.status(), Supabase.Fetcher.headers(),
                    body :: Enumerable.t()} -&gt;
                     {:ok, response()} | {:error, term()})
```

# `upload`

```elixir
@callback upload(Supabase.Fetcher.Request.t(), filepath :: Path.t(), request_opts()) ::
  {:ok, response()} | {:error, term()}
```

# `not_implemented_error`

```elixir
@spec not_implemented_error(module(), atom(), integer()) :: Supabase.Error.t()
```

---

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