Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Example transformation doesn't seem to work as expected #4

Closed
tomwganem opened this issue Aug 14, 2018 · 3 comments
Closed

Example transformation doesn't seem to work as expected #4

tomwganem opened this issue Aug 14, 2018 · 3 comments

Comments

@tomwganem
Copy link

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
Copy link
Owner

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
Copy link
Owner

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
Copy link
Author

Thank you for fixing things so quickly 👍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants