defmodule Systemd.Properties do @moduledoc """ Client for `org.freedesktop.DBus.Properties`. """ alias Systemd.{DBus, Error} @destination "org.freedesktop.systemd1" @interface "org.freedesktop.DBus.Properties" @doc """ Reads one property from a D-Bus object. """ @spec get(pid(), String.t(), String.t(), String.t()) :: {:ok, term()} | {:error, Error.t()} def get(conn, object_path, interface, property) do with {:ok, [value]} <- DBus.call_body(conn, destination: @destination, path: object_path, interface: @interface, member: "Get", signature: "ss", body: [interface, property] ) do {:ok, unwrap_variant(value)} end end @doc """ Reads every property for an interface from a D-Bus object. """ @spec get_all(pid(), String.t(), String.t()) :: {:ok, map()} | {:error, Error.t()} def get_all(conn, object_path, interface) do with {:ok, [properties]} <- DBus.call_body(conn, destination: @destination, path: object_path, interface: @interface, member: "GetAll", signature: "s", body: [interface] ) do {:ok, Map.new(properties, fn {name, value} -> {name, unwrap_variant(value)} end)} end end defp unwrap_variant({:variant, value}), do: value defp unwrap_variant({_signature, value}), do: value defp unwrap_variant(value), do: value end