bitwalker/toml-elixir

Example transformation doesn't seem to work as expected

tomwganem opened this issue · 3 comments

iex(workflow_engine@tomwganem.local)17> input = """
...(workflow_engine@tomwganem.local)17> [servers.alpha]
...(workflow_engine@tomwganem.local)17> ip = "192.168.1.1"
...(workflow_engine@tomwganem.local)17> ports = [8080, 8081]
...(workflow_engine@tomwganem.local)17>
...(workflow_engine@tomwganem.local)17> [servers.beta]
...(workflow_engine@tomwganem.local)17> ip = "192.168.1.2"
...(workflow_engine@tomwganem.local)17> ports = [8082, 8083]
...(workflow_engine@tomwganem.local)17> """
"[servers.alpha]\nip = \"192.168.1.1\"\nports = [8080, 8081]\n\n[servers.beta]\nip = \"192.168.1.2\"\nports = [8082, 8083]\n"
iex(workflow_engine@tomwganem.local)18> defmodule Server do
...(workflow_engine@tomwganem.local)18>   defstruct [:name, :ip, :ports]
...(workflow_engine@tomwganem.local)18> end
warning: redefining module Server (current version loaded from _build/dev/lib/workflow_engine/ebin/Elixir.Server.beam)
  iex:18

{:module, Server,
 <<70, 79, 82, 49, 0, 0, 5, 220, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 183,
   0, 0, 0, 18, 13, 69, 108, 105, 120, 105, 114, 46, 83, 101, 114, 118, 101,
   114, 8, 95, 95, 105, 110, 102, 111, 95, 95, ...>>,
 %Server{ip: nil, name: nil, ports: nil}}
iex(workflow_engine@tomwganem.local)19>
nil
iex(workflow_engine@tomwganem.local)20> defmodule IPStringToCharlist do
...(workflow_engine@tomwganem.local)20>   use Toml.Transform
...(workflow_engine@tomwganem.local)20>
...(workflow_engine@tomwganem.local)20>   def transform(:ip, v) when is_binary(v) do
...(workflow_engine@tomwganem.local)20>     String.to_charlist(v)
...(workflow_engine@tomwganem.local)20>   end
...(workflow_engine@tomwganem.local)20>   def transform(_k, v), do: v
...(workflow_engine@tomwganem.local)20> end
warning: redefining module IPStringToCharlist (current version loaded from _build/dev/lib/workflow_engine/ebin/Elixir.IPStringToCharlist.beam)
  iex:20

{:module, IPStringToCharlist,
 <<70, 79, 82, 49, 0, 0, 4, 224, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 171,
   0, 0, 0, 16, 25, 69, 108, 105, 120, 105, 114, 46, 73, 80, 83, 116, 114, 105,
   110, 103, 84, 111, 67, 104, 97, 114, 108, ...>>, {:transform, 2}}
iex(workflow_engine@tomwganem.local)21>
nil
iex(workflow_engine@tomwganem.local)22> defmodule CharlistToIP do
...(workflow_engine@tomwganem.local)22>   use Toml.Transform
...(workflow_engine@tomwganem.local)22>
...(workflow_engine@tomwganem.local)22>   def transform(:ip, v) when is_list(v) do
...(workflow_engine@tomwganem.local)22>     case :inet.parse_ipv4_address(v) do
...(workflow_engine@tomwganem.local)22>       {:ok, address} ->
...(workflow_engine@tomwganem.local)22>         address
...(workflow_engine@tomwganem.local)22>       {:error, reason} ->
...(workflow_engine@tomwganem.local)22>         {:error, {:invalid_ip_address, reason}}
...(workflow_engine@tomwganem.local)22>     end
...(workflow_engine@tomwganem.local)22>   end
...(workflow_engine@tomwganem.local)22>   def transform(:ip, v), do: {:error, {:invalid_ip_address, v}}
...(workflow_engine@tomwganem.local)22>   def transform(_k, v), do: v
...(workflow_engine@tomwganem.local)22> end
warning: redefining module CharlistToIP (current version loaded from _build/dev/lib/workflow_engine/ebin/Elixir.CharlistToIP.beam)
  iex:22

{:module, CharlistToIP,
 <<70, 79, 82, 49, 0, 0, 5, 184, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 191,
   0, 0, 0, 19, 19, 69, 108, 105, 120, 105, 114, 46, 67, 104, 97, 114, 108, 105,
   115, 116, 84, 111, 73, 80, 8, 95, 95, ...>>, {:transform, 2}}
iex(workflow_engine@tomwganem.local)23>
nil
iex(workflow_engine@tomwganem.local)24> defmodule ServerMapToList do
...(workflow_engine@tomwganem.local)24>   use Toml.Transform
...(workflow_engine@tomwganem.local)24>
...(workflow_engine@tomwganem.local)24>   def transform(:servers, v) when is_map(v) do
...(workflow_engine@tomwganem.local)24>     for {name, server} <- v, do: struct(Server, Map.put(v, :name, name))
...(workflow_engine@tomwganem.local)24>   end
...(workflow_engine@tomwganem.local)24>   def transform(_k, v), do: v
...(workflow_engine@tomwganem.local)24> end
warning: redefining module ServerMapToList (current version loaded from _build/dev/lib/workflow_engine/ebin/Elixir.ServerMapToList.beam)
  iex:24

warning: variable "server" is unused
  iex:28

{:module, ServerMapToList,
 <<70, 79, 82, 49, 0, 0, 6, 24, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 249,
   0, 0, 0, 25, 22, 69, 108, 105, 120, 105, 114, 46, 83, 101, 114, 118, 101,
   114, 77, 97, 112, 84, 111, 76, 105, 115, 116, ...>>, {:transform, 2}}
iex(workflow_engine@tomwganem.local)25> transforms = [IPStringToCharlist, CharlistToIP, ServerMapToList]
[IPStringToCharlist, CharlistToIP, ServerMapToList]
iex(workflow_engine@tomwganem.local)26> Toml.decode(input, keys: :atoms, transforms: transforms)
{:ok,
 %{
   servers: [
     %Server{ip: nil, name: :alpha, ports: nil},
     %Server{ip: nil, name: :beta, ports: nil}
   ]
 }}

The error is in your ServerMapToList transform - there is a typo Map.put(v, :name, name) when it should be Map.put(server, :name, name).

Just an FYI - the test suite has tests for the transforms, I wrote the README from hand, so it seems like I goofed a few times, sorry about that :(

Thank you for fixing things so quickly 👍