Skip to content

Instantly share code, notes, and snippets.

@bamorim
Created December 10, 2017 23:50
Show Gist options
  • Save bamorim/8115a2b36dc2582f7697adf6d915e10a to your computer and use it in GitHub Desktop.
Save bamorim/8115a2b36dc2582f7697adf6d915e10a to your computer and use it in GitHub Desktop.
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