Skip to main content

lib/systemd/dbus/signature.ex

defmodule Systemd.DBus.Signature do
  @moduledoc false

  @supported_complex_signatures MapSet.new([
                                  "a(ssssssouso)",
                                  "a(ss)",
                                  "a(usssoo)",
                                  "a{sv}",
                                  "a(sv)",
                                  "a(sa(sv))",
                                  "ssa(sv)a(sa(sv))"
                                ])

  @doc false
  @spec supported?(String.t()) :: boolean()
  def supported?(signature) when is_binary(signature) do
    primitive?(signature) or MapSet.member?(@supported_complex_signatures, signature)
  end

  defp primitive?(""), do: true

  defp primitive?(signature) do
    signature
    |> String.to_charlist()
    |> Enum.all?(&(&1 in ~c"syobintqxuagdvh"))
  end
end