defmodule Image.Plug.SourceResolver do @moduledoc """ Behaviour for source resolvers. A resolver turns a `t:Image.Plug.Source.t/0` into an open `Vix.Vips.Image` plus a small bag of metadata used for HTTP cache headers (`content_type`, `etag_seed`, optionally `last_modified` and `byte_size`). A resolver typically handles one `Image.Plug.Source` kind. The default `Image.Plug.SourceResolver.Composite` dispatches by kind to a configured set of per-kind resolvers. """ alias Image.Plug.{Error, Source} @typedoc """ Metadata about the resolved source. The plug uses these values to build cache headers and to fingerprint the response for ETag computation. * `:content_type` — the MIME type of the source bytes. * `:etag_seed` — any stable per-source binary. `Image.Plug.Cache` hashes this together with the pipeline fingerprint to compute the response ETag. * `:last_modified` — optional `DateTime` to emit as `Last-Modified`. * `:byte_size` — optional integer; informational. * `:cache_control` — optional `Cache-Control` directive to forward on the response. * `:immutable?` — if `true`, the cache layer may add `immutable`. """ @type meta :: %{ required(:content_type) => String.t(), required(:etag_seed) => binary(), optional(:last_modified) => DateTime.t(), optional(:byte_size) => non_neg_integer(), optional(:cache_control) => String.t(), optional(:immutable?) => boolean() } @doc """ Loads the source bytes referenced by `source` and opens them as a `Vix.Vips.Image`. Returns the open image plus a `t:meta/0` map. """ @callback load(Source.t(), options :: keyword()) :: {:ok, Vix.Vips.Image.t(), meta()} | {:error, Error.t()} end