lib/plug_caisson/brotli.ex

defmodule PlugCaisson.Brotli do
  @behaviour PlugCaisson

  @moduledoc """
  Implementation for [Brotli][] compression.

  [Brotli]: https://brotli.org
  """

  if Code.ensure_loaded?(:brotli_decoder) do
    @impl true
    def init(_opts) do
      {:ok, :brotli_decoder.new()}
    end

    @impl true
    def deinit(_state), do: :ok

    @impl true
    def process(decoder, data, _opts) do
      case :brotli_decoder.stream(decoder, data) do
        {result, data} when result in [:ok, :more] -> {result, data, decoder}
        :error -> {:error, :decompression_error}
      end
    end
  else
    @impl true
    def init(_opts) do
      {:error, :not_supported}
    end

    @impl true
    def deinit(_state), do: :ok

    @impl true
    def process(_state, _data, _opts) do
      {:error, :not_supported}
    end
  end
end