# `Jido.Messaging.Moderation`
[🔗](https://github.com/agentjido/jido_messaging/blob/v1.0.0/lib/jido_messaging/moderation.ex#L1)

Moderation behaviour and utilities for message filtering.

Provides a behaviour for implementing content moderation strategies,
plus utilities for composing and applying moderators.

## Implementing a Moderator

    defmodule MyApp.SpamFilter do
      @behaviour Jido.Messaging.Moderation

      @impl true
      def moderate(message, _opts) do
        if contains_spam?(message) do
          {:reject, :spam, "Message contains spam"}
        else
          :allow
        end
      end

      defp contains_spam?(_message), do: false
    end

## Moderation Results

- `:allow` - Message passes moderation
- `{:reject, reason, description}` - Message is rejected
- `{:flag, reason, description}` - Message is flagged for review but allowed
- `{:modify, message}` - Message is modified (e.g., content filtered)

# `description`

```elixir
@type description() :: String.t()
```

# `reason`

```elixir
@type reason() :: atom()
```

# `result`

```elixir
@type result() ::
  :allow
  | {:reject, reason(), description()}
  | {:flag, reason(), description()}
  | {:modify, Jido.Messaging.Message.t()}
```

# `moderate`

```elixir
@callback moderate(message :: Jido.Messaging.Message.t(), opts :: keyword()) :: result()
```

Moderate a message before it is processed.

Returns a moderation result indicating whether the message should be
allowed, rejected, flagged, or modified.

# `allowed?`

Check if a moderation result allows the message.

# `apply_moderators`

Apply a list of moderators to a message in sequence.

Stops at the first rejection. Flags are accumulated.
Modifications are applied in order.

Returns `{:ok, message, flags}` or `{:error, reason, description}`.

---

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