Created
December 10, 2017 23:50
-
-
Save bamorim/8115a2b36dc2582f7697adf6d915e10a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
defmodule CoreBanking.StructSerializer do | |
@behaviour EventStore.Serializer | |
def serialize(x) do | |
do_serialize(x) |> Poison.encode! | |
end | |
def deserialize(x, _opts) do | |
x |> Poison.decode! |> do_deserialize | |
end | |
defp do_serialize(t) when is_map(t) do | |
t | |
|> Map.to_list() | |
|> Enum.map(&map_serialize/1) | |
|> Enum.into(%{}) | |
end | |
defp do_serialize(t), do: t | |
defp map_serialize({:__struct__, mod}) do | |
{"__struct__", to_string(mod)} | |
end | |
defp map_serialize({k, v}) do | |
{k, do_serialize(v)} | |
end | |
defp do_deserialize(%{"__struct__" => s} = map) do | |
atomized = map | |
|> Map.delete("__struct__") | |
|> do_deserialize | |
|> Map.to_list() | |
|> Enum.map(fn {k,v} -> {String.to_atom(k), v} end) | |
|> Enum.into(%{}) | |
struct(String.to_atom(s), atomized) | |
end | |
defp do_deserialize(t) when is_map(t) do | |
t | |
|> Map.to_list() | |
|> Enum.map(&map_deserialize/1) | |
|> Enum.into(%{}) | |
end | |
defp do_deserialize(t), do: t | |
defp map_deserialize({k, v}) do | |
{k, do_deserialize(v)} | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment