Packages

Elixir-native host management with inspectable plans, package locks, systemd isolation, and remote bootstrap.

Current section

Files

Jump to
host_kit lib host_kit resources package.ex
Raw

lib/host_kit/resources/package.ex

defmodule HostKit.Resources.Package do
@moduledoc "Desired OS package installed through the target package manager."
@type source :: :semantic | :explicit
@type t :: %__MODULE__{
name: atom() | String.t(),
system_name: String.t(),
version: String.t() | nil,
source: source(),
update: boolean(),
rollback: :keep,
depends_on: [term()],
meta: map()
}
defstruct name: nil,
system_name: nil,
version: nil,
source: :semantic,
update: false,
rollback: :keep,
depends_on: [],
meta: %{}
@spec new(atom() | String.t(), keyword()) :: t()
def new(name, opts \\ []) do
%__MODULE__{
name: name,
system_name: Keyword.get(opts, :as, default_package_name(name)),
version: Keyword.get(opts, :version),
source: Keyword.get(opts, :source, default_source(opts)),
update: Keyword.get(opts, :update, false),
rollback: Keyword.get(opts, :rollback, :keep),
depends_on: Keyword.get(opts, :depends_on, []),
meta: opts |> Keyword.get(:meta, %{}) |> maybe_put_provides(opts)
}
end
@spec id(t()) :: {:package, atom() | String.t()}
def id(%__MODULE__{name: name}), do: {:package, name}
defp maybe_put_provides(meta, opts) do
case Keyword.fetch(opts, :provides) do
{:ok, provides} -> Map.put(meta, :provides, provides)
:error -> meta
end
end
defp default_source(opts) do
if Keyword.has_key?(opts, :as), do: :explicit, else: :semantic
end
defp default_package_name(name) do
name
|> to_string()
|> String.replace("_", "-")
end
end