Skip to content

Instantly share code, notes, and snippets.

@bunker-inspector
Last active December 21, 2018 21:35
Show Gist options
  • Save bunker-inspector/8a1acbcfcf459b284ed709fc04e07ad2 to your computer and use it in GitHub Desktop.
Save bunker-inspector/8a1acbcfcf459b284ed709fc04e07ad2 to your computer and use it in GitHub Desktop.
Helper module for more ergonomic ecto model json encoding
defmodule EctoEncoder do
def encode(struct, opts \\ []) do
struct
|> Map.from_struct
|> (fn x -> if opts[:take] !== nil, do: Map.take(x, opts[:take]), else: x end).()
|> Map.drop([:__meta__|(opts[:drop] || [])])
|> Enum.reduce(%{}, fn
{_, %Ecto.Association.NotLoaded{}}, acc -> acc
{key, value}, acc -> Map.put(acc, key, value)
end)
end
defmacro generate_encoder(encoder_opts \\ []) do
quote do
defimpl Jason.Encoder, for: __MODULE__ do
def encode(x, opts), do: EctoEncoder.encode(x, unquote(encoder_opts)) |> Jason.Encoder.encode(opts)
end
end
end
defmacro generate_encoder_for(module, encoder_opts \\ []) do
quote do
defimpl Jason.Encoder, for: unquote(module) do
def encode(x, opts), do: EctoEncoder.encode(x, unquote(encoder_opts)) |> Jason.Encoder.encode(opts)
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment