diff --git a/lib/apex/format.ex b/lib/apex/format.ex index b33c17e..e71300a 100644 --- a/lib/apex/format.ex +++ b/lib/apex/format.ex @@ -116,13 +116,30 @@ defimpl Apex.Format, for: Map do end def format(data, options) do - Apex.Format.Seq.format( - Map.to_list(data), - options, - start_token: "\%{", - end_token: "}", - numbers: false) |> colorize(data, options) - end + ap_options = :apex + |> Application.get_all_env + |> Keyword.merge(options) + + data + |> keys_to_atoms(ap_options[:keys_to_atoms]) + |> Map.to_list + |> Apex.Format.Seq.format( + ap_options, + start_token: "\%{", + end_token: "}", + numbers: false) + |> colorize(data, ap_options) + end + + defp keys_to_atoms(data, shouldConvert) + defp keys_to_atoms(data, true) do + Map.new(data, fn {k,v} -> { convert_to_atom(k), v} end) + end + defp keys_to_atoms(data, _), do: data + + defp convert_to_atom(key) + defp convert_to_atom(key) when is_binary(key), do: String.to_atom(key) + defp convert_to_atom(key), do: key end defimpl Apex.Format, for: Any do diff --git a/test/format_test.exs b/test/format_test.exs index 4807459..99d4adf 100644 --- a/test/format_test.exs +++ b/test/format_test.exs @@ -172,4 +172,103 @@ defmodule Apex.Format.Test do ] """ end + + test "Can format maps and change keys to atoms" do + data = %{"foo" => "bar", "bar" => "baz", + "mappings" => [ + %{"foo1" => "bar1", "bar1" => "baz1" }, + %{"foo2" => "bar2", "bar2" => "baz2" } + ] + } + assert format(data, keys_to_atoms: true, color: false) == """ + %{ + bar: "baz" + foo: "bar" + mappings: [ + [0] %{ + bar1: "baz1" + foo1: "bar1" + } + [1] %{ + bar2: "baz2" + foo2: "bar2" + } + ] + } + """ + end + + test "Can format maps and change keys to atoms (mixed)" do + data = %{ + foo: "bar", + bar: "baz", + mappings: [ + %{ "foo1" => "bar1", "bar1" => "baz1" }, + %{ "foo2" => "bar2", "bar2" => "baz2" } + ] + } + assert format(data, keys_to_atoms: true, color: false) == """ + %{ + bar: "baz" + foo: "bar" + mappings: [ + [0] %{ + bar1: "baz1" + foo1: "bar1" + } + [1] %{ + bar2: "baz2" + foo2: "bar2" + } + ] + } + """ + end + + test "Can format maps and leave keys as is" do + data = %{"foo" => "bar", "bar" => "baz", + "mappings" => [ + %{"foo1" => "bar1", "bar1" => "baz1" }, + %{"foo2" => "bar2", "bar2" => "baz2" } + ] + } + assert format(data, keys_to_atoms: false, color: false) == """ + %{ + { + [0] "bar" + [1] "baz" + } + { + [0] "foo" + [1] "bar" + } + { + [0] "mappings" + [1] [ + [0] %{ + { + [0] "bar1" + [1] "baz1" + } + { + [0] "foo1" + [1] "bar1" + } + } + [1] %{ + { + [0] "bar2" + [1] "baz2" + } + { + [0] "foo2" + [1] "bar2" + } + } + ] + } + } + """ + end + end