# `DripDrop.Channel`
[🔗](https://github.com/agoodway/dripdrop/blob/v0.1.0/lib/dripdrop/channel.ex#L1)

Uniform contract implemented by DripDrop channel providers.

# `credential_errors`

```elixir
@type credential_errors() :: [{atom(), binary()}]
```

# `delivery_error`

```elixir
@type delivery_error() :: %{kind: error_kind(), reason: term()}
```

# `delivery_success`

```elixir
@type delivery_success() :: %{
  optional(:provider_message_id) =&gt; binary() | nil,
  optional(:response) =&gt; map()
}
```

# `error_kind`

```elixir
@type error_kind() :: :temporary | :permanent
```

# `webhook_route`

```elixir
@type webhook_route() :: {atom(), binary(), module()}
```

# `deliver`

```elixir
@callback deliver(Ecto.Schema.t(), term(), Ecto.Schema.t()) ::
  {:ok, delivery_success()} | {:error, delivery_error()}
```

# `validate_credentials`

```elixir
@callback validate_credentials(map()) :: :ok | {:error, credential_errors()}
```

# `verify_signature`

```elixir
@callback verify_signature(Ecto.Schema.t(), term()) :: :ok | {:error, term()}
```

# `webhook_routes`

```elixir
@callback webhook_routes(Ecto.Schema.t()) :: [webhook_route()]
```

---

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