defmodule Image.Plug.VariantStore do
@moduledoc """
Behaviour for variant stores.
A variant store persists `Image.Plug.Variant` records keyed by
name. Reads are expected to be cheap (every request that resolves a
variant performs one read); writes are expected to be infrequent.
The default implementation `Image.Plug.VariantStore.ETS` is
in-memory. A file-backed and a database-backed store may follow in
later milestones.
"""
alias Image.Plug.Variant
@doc """
Fetches a variant by name.
Returns `{:ok, variant}` or `{:error, :not_found}`.
"""
@callback get(name :: String.t(), options :: keyword()) ::
{:ok, Variant.t()} | {:error, :not_found}
@doc """
Inserts or updates a variant.
Returns `{:ok, stored}` where `stored` may differ from the input
(for example, with `:inserted_at` / `:updated_at` populated).
"""
@callback put(Variant.t(), options :: keyword()) ::
{:ok, Variant.t()} | {:error, term()}
@doc """
Deletes a variant by name.
Returns `:ok` or `{:error, :not_found}`.
"""
@callback delete(name :: String.t(), options :: keyword()) ::
:ok | {:error, :not_found}
@doc """
Lists every stored variant. The order is implementation-defined.
"""
@callback list(options :: keyword()) :: {:ok, [Variant.t()]}
end