lib/documents/document.ex

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