Skip to main content

lib/pull_policy.ex

defmodule TestcontainerEx.PullPolicy do
  @moduledoc """
  Pull policies that control whether an image is fetched from a remote registry
  before starting a container.
  """

  alias TestcontainerEx.PullPolicy

  @type t :: %__MODULE__{
          always_pull: boolean() | nil,
          pull_if_missing: boolean() | nil,
          pull_condition: (struct(), Req.Response.t() -> boolean()) | nil
        }

  defstruct [:always_pull, :pull_if_missing, :pull_condition]

  @spec always_pull() :: PullPolicy.t()
  @doc """
  Returns a pull policy that always pulls the image.

      iex> TestcontainerEx.PullPolicy.always_pull()
      %TestcontainerEx.PullPolicy{always_pull: true, pull_if_missing: nil, pull_condition: nil}
  """
  def always_pull do
    %__MODULE__{always_pull: true}
  end

  @spec never_pull() :: PullPolicy.t()
  @doc """
  Returns a pull policy that never pulls the image.

      iex> TestcontainerEx.PullPolicy.never_pull()
      %TestcontainerEx.PullPolicy{always_pull: nil, pull_if_missing: nil, pull_condition: nil}
  """
  def never_pull do
    %__MODULE__{}
  end

  @spec pull_if_missing() :: PullPolicy.t()
  @doc """
  Returns a pull policy that pulls only when the image is not present locally.

      iex> TestcontainerEx.PullPolicy.pull_if_missing()
      %TestcontainerEx.PullPolicy{always_pull: nil, pull_if_missing: true, pull_condition: nil}
  """
  def pull_if_missing do
    %__MODULE__{pull_if_missing: true}
  end

  @spec pull_condition(
          expr ::
            (config :: struct(), conn :: Req.Response.t() -> true | false)
        ) ::
          PullPolicy.t()
  def pull_condition(expr) do
    %__MODULE__{pull_condition: expr}
  end
end