Skip to main content

lib/release_kit/package.ex

defmodule ReleaseKit.Package do
  @moduledoc """
  Normalizes package policy options for artifact tarballs.
  """

  @default_options [cache: true, compression: :gzip, reuse: :copy]

  @type compression :: :gzip | :none
  @type reuse :: false | :copy | :hardlink
  @type options :: keyword()

  @doc """
  Returns true when package cache reuse is enabled.
  """
  @spec cache?(options()) :: boolean()
  def cache?(options) do
    options
    |> normalize()
    |> Keyword.fetch!(:cache)
  end

  @doc """
  Returns the configured package compression mode.
  """
  @spec compression(options()) :: compression()
  def compression(options) do
    options
    |> normalize()
    |> Keyword.fetch!(:compression)
  end

  @doc """
  Returns how cached package bytes should be reused across artifact names.
  """
  @spec reuse(options()) :: reuse()
  def reuse(options) do
    options
    |> normalize()
    |> Keyword.fetch!(:reuse)
  end

  @doc """
  Returns the supported package option keys.
  """
  @spec option_keys() :: [atom()]
  def option_keys, do: Keyword.keys(@default_options)

  defp normalize(nil), do: @default_options
  defp normalize(options) when is_list(options), do: Keyword.merge(@default_options, options)
end