defmodule Systemd.TransientUnit.Property do @moduledoc """ A typed systemd transient-unit property. Systemd's `StartTransientUnit` expects properties as D-Bus `(sv)` structs. This struct keeps that contract explicit instead of passing anonymous tuples or lists through the public API. """ @type t :: %__MODULE__{ name: String.t(), signature: String.t(), value: term() } @enforce_keys [:name, :signature, :value] defstruct [:name, :signature, :value] @doc """ Builds a transient-unit property. """ @spec new(String.t(), String.t(), term()) :: t() def new(name, signature, value) when is_binary(name) and is_binary(signature) do %__MODULE__{name: name, signature: signature, value: value} end @doc false @spec to_dbus(t()) :: [String.t() | {String.t(), term()}] def to_dbus(%__MODULE__{name: name, signature: signature, value: value}) do [name, {signature, normalize_structs(value)}] end defp normalize_structs(values) when is_list(values), do: Enum.map(values, &normalize_structs/1) defp normalize_structs(values) when is_tuple(values), do: values |> Tuple.to_list() |> normalize_structs() defp normalize_structs(value), do: value end