lib/frugality/encoder.ex

defmodule Frugality.Encoder do
  @moduledoc """
  A behaviour for entity-tag encoding.

  Defines a single callback - `c:Frugality.Encoder.encode/1`, which
  expects an `t:iodata/0` and returns a `t:binary/0`.

  The callback signature is required, instead of simply expecting and
  returning a `t:binary/0`, because one can represent the entity-tag's
  source as an `t:iolist/0`.
  """

  @type t() :: module()

  @callback encode(iodata()) :: binary()

  defguardp is_iodata(term) when is_binary(term) or is_list(term)

  @doc false
  @spec encode(module(), iodata()) :: binary()
  def encode(impl, iodata) when is_atom(impl) and is_iodata(iodata) do
    impl.encode(iodata)
  end
end