Skip to main content

lib/systemd/manager/options.ex

defmodule Systemd.Manager.Options do
  @moduledoc """
  Normalized options for systemd manager operations.
  """

  @type t :: %__MODULE__{
          bus: Systemd.DBus.bus(),
          mode: String.t(),
          wait: boolean(),
          timeout: non_neg_integer(),
          interval: pos_integer(),
          runtime: boolean(),
          force: boolean()
        }

  defstruct bus: :system,
            mode: "replace",
            wait: true,
            timeout: 30_000,
            interval: 100,
            runtime: false,
            force: false

  @doc false
  @spec new(keyword() | t()) :: t()
  def new(%__MODULE__{} = opts), do: opts

  def new(opts) when is_list(opts) do
    struct!(__MODULE__,
      bus: Keyword.get(opts, :bus, :system),
      mode: Keyword.get(opts, :mode, "replace"),
      wait: Keyword.get(opts, :wait, true),
      timeout: Keyword.get(opts, :timeout, 30_000),
      interval: Keyword.get(opts, :interval, 100),
      runtime: Keyword.get(opts, :runtime, false),
      force: Keyword.get(opts, :force, false)
    )
  end

  @doc false
  @spec await_opts(t()) :: keyword()
  def await_opts(%__MODULE__{timeout: timeout, interval: interval}) do
    [timeout: timeout, interval: interval]
  end
end