defmodule EventStore.JsonbSerializer do @moduledoc """ Serialize to/from PostgreSQL's native `jsonb` format. """ @behaviour EventStore.Serializer def serialize(%_{} = term) do term |> Map.from_struct() |> Enum.map(fn {k, v} -> {Atom.to_string(k), v} end) |> Enum.into(%{}) end def serialize(term), do: term def deserialize(term, config) do case Keyword.get(config, :type, nil) do nil -> term type -> type |> String.to_existing_atom() |> to_struct(term) end end def to_struct(type, term) do struct(type, keys_to_atoms(term)) end defp keys_to_atoms(map) when is_map(map) do for {key, value} <- map, into: %{} do {String.to_existing_atom(key), keys_to_atoms(value)} end end defp keys_to_atoms(value), do: value end