Current section
Files
Jump to
Current section
Files
lib/ecto/ecto_serializer.ex
defmodule Rubbergloves.EctoSerializer do
@moduledoc"""
Utility to serialize ecto structs to maps
"""
@exceptions [NaiveDateTime, DateTime]
@bloat [:__meta__, :__struct__, :__cardinality__, :__field__, :__owner__]
def serialize(schema, modules) when is_map(schema) do
additional =
cond do
Map.has_key?(schema, :__struct__) ->
{_, additional} =
Enum.find(modules, {:none, []}, fn {module, _} -> module == schema.__struct__ end)
additional
true ->
[]
end
keys = (Map.keys(schema) -- @bloat) -- additional
Map.take(schema, keys)
|> Enum.map(&serialize(&1, modules))
|> Enum.into(%{})
end
def serialize({key, %{__struct__: struct} = val}, _) when struct in @exceptions, do: {key, val}
def serialize(list, modules) when is_list(list), do: Enum.map(list, &serialize(&1, modules))
def serialize({key, val}, modules) when is_map(val) or is_list(val),
do: {key, serialize(val, modules)}
def serialize(data, _), do: data
end