defmodule Ravix.Document do @moduledoc """ Macro to facilitate the representation of a Raven Document ## Example `defmodule Ravix.TestDocument do use Ravix.Document, fields: [ name: nil, id: nil ] end` """ defmacro compile_configs(opts) do quote bind_quoted: [opts: opts] do fields = Keyword.get(opts, :fields) only = Keyword.get(opts, :only) except = Keyword.get(opts, :except) {fields, only, except} end end defmacro __using__(opts) do quote bind_quoted: [opts: opts] do import Ravix.Document @base_fields [:"@metadata"] {fields, only, except} = compile_configs(opts) fields = @base_fields ++ fields if only != nil do @derive {Jason.Encoder, only: only} end if except != nil && only == nil do @derive {Jason.Encoder, except: except} end if except == nil && only == nil do @derive Jason.Encoder end defstruct fields end end end