defmodule ConfigCat.ConfigCache do
  @moduledoc """
  Defines a configuration cache.

  A calling application can optionally supply its own cache implementation to use
  in place of the default in-memory cache by providing the implementation's module name
  as the `:cache` option in `ConfigCat.child_spec/1`.

  The provided implementation must explicitly or implicitly implement this behaviour.

  If the cache implementation is a GenServer or similar, it is the calling
  application's responsibility to add it to its own supervision tree.

  @typedoc "The cache key under which the configuration is stored"
  @type key :: String.t()

  @typedoc "The result of a cache fetch."
  @type result :: {:ok, String.t()} | {:error, :not_found}

  @doc """
  Fetches the serialized configuration stored under the given cache key.

  Returns `{:ok, serialized_config}` if there is a cached configuration or
  `{:error, :not_found}` if not.
  @callback get(key) :: result()

  @doc """
  Stores an updated serialized configuration under the given cache key.

  Returns :ok.
  @callback set(key, config :: String.t()) :: :ok | {:error, term()}