lib/appsignal/utils/argument_cleaner.ex

defmodule Appsignal.Utils.ArgumentCleaner do
  alias Appsignal.Utils.Type

  def clean(argument)
      when is_boolean(argument) or is_integer(argument) or is_float(argument) or is_pid(argument) or
             is_port(argument) or is_reference(argument) do
    argument
  end

  def clean(argument) when is_map(argument) do
    {struct, map} = Map.pop(argument, :__struct__)

    "%#{Appsignal.Utils.module_name(struct)}{#{Enum.map_join(map, ", ", fn {key, value} -> "#{inspect(key)} => #{inspect(clean(value))}" end)}}"
  end

  def clean(argument), do: Type.from(argument)
end