defmodule ExMobileDevice.Plist do @moduledoc false def encode(data), do: to_plist(data) def decode(<<"bplist00", _::binary>> = data), do: Elixir.Pealist.decode(data) def decode(data), do: Pealist.decode(data) defp to_plist(v) do [~s(), to_plist_value(v), ""] end defp to_plist_value(dict) when is_map(dict) do entries = Enum.reduce(dict, [], fn {k, v}, iodata -> [iodata, "#{k}", to_plist_value(v)] end) ["", entries, ""] end defp to_plist_value({:data, v}) when is_binary(v), do: "#{Base.encode64(v)}" defp to_plist_value(v) when is_binary(v), do: "#{v}" defp to_plist_value(v) when is_integer(v), do: "#{v}" defp to_plist_value(true), do: "" defp to_plist_value(false), do: "" end