Example transformation doesn't seem to work as expected
tomwganem opened this issue · 3 comments
tomwganem commented
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}
]
}}
bitwalker commented
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)
.
bitwalker commented
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 :(
tomwganem commented
Thank you for fixing things so quickly 👍