defmodule OneAndDone.Request do @moduledoc """ Capture the request information that we want to cache. Headers are not included in the cache key because they can change from request to request and should not influence the substance of the request being made to a controller. Generally we do not cache this Request struct, but we do cache the hash of the struct so that we can compare subsequent requests to the original request. If the hashes don't match, we return an error. If the hashes do match, then we can continue processing. """ @type t :: %__MODULE__{ host: binary(), port: non_neg_integer(), scheme: binary(), method: binary(), path: binary(), query_string: binary(), body: binary() } @enforce_keys [ :host, :port, :scheme, :method, :path, :query_string, :body ] defstruct @enforce_keys @doc """ Hashes the request struct. """ @spec hash(t()) :: non_neg_integer() def hash(%__MODULE__{} = request) do :erlang.phash2(request) end end