defmodule Honeybadger.Filter do
  alias Honeybadger.Breadcrumbs.Breadcrumb

  @moduledoc """
  Specification of user overrideable filter functions.

  See moduledoc for `Honeybadger.Filter.Mixin` for details on implementing
  your own filter.
  """

  @doc """
  Filter the context Map.  The context is a map of application supplied data.
  """
  @callback filter_context(map) :: map

  @doc """
  For applications that use `Honeybadger.Plug`, filters the query parameters.
  The parameters is a map of `String.t` to `String.t`, e.g.:

      %{"user_name" => "fred", "password" => "12345"}
  """
  @callback filter_params(map) :: map

  @doc """
  For applications that use `Honeybadger.Plug`, filter the cgi_data.

  `cgi_data` is a map of `String.t` to `String.t` which includes HTTP headers
  and other pre-defined request data (including `PATH_INFO`, `QUERY_STRING`,
  `SERVER_PORT` etc.).
  """
  @callback filter_cgi_data(map) :: map

  @doc """
  For applications that use `Honeybadger.Plug`, filter the session.
  """
  @callback filter_session(map) :: map

  @doc """
  Filter the error message string.  This is the message from the most
  recently thrown error.
  """
  @callback filter_error_message(String.t()) :: String.t()

  @doc """
  Filter breadcrumbs. This filter function receives a list of Breadcrumb
  structs. You could use any Enum function to constrain the set. Let's say you
  want to remove any breadcrumb that have metadata that contain SSN:

  def filter_breadcrumbs(breadcrumbs) do
    Enum.reject(breadcrumbs, fn breadcrumb -> do
      Map.has_key?(breadcrumb.metadata, :ssn)
    end)
  end
  """
  @callback filter_breadcrumbs([Breadcrumb.t()]) :: [Breadcrumb.t()]
end
