defmodule HostKit.Mise do
@moduledoc "Runtime boundary for managing mise and mise-installed tools."
alias HostKit.Resources.Mise, as: MiseResource
@callback read(MiseResource.t(), map()) :: {:ok, MiseResource.t() | nil} | {:error, term()}
@callback install(MiseResource.t(), keyword()) :: :ok | {:error, term()}
@spec read(MiseResource.t(), map()) :: {:ok, MiseResource.t() | nil} | {:error, term()}
def read(%MiseResource{} = mise, context \\ %{}) do
implementation = impl(context)
implementation.read(mise, context)
end
@spec install(MiseResource.t(), keyword()) :: :ok | {:error, term()}
def install(%MiseResource{} = mise, opts \\ []) do
implementation = impl(opts)
implementation.install(mise, opts)
end
defp impl(%{opts: opts}), do: impl(opts)
defp impl(opts) when is_list(opts), do: Keyword.get(opts, :mise_impl, HostKit.Mise.CLI)
defp impl(_context), do: HostKit.Mise.CLI
end