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