defmodule Ravix.Documents.Commands.RavenCommand do @moduledoc """ Macro to define the basic required fields for a RavenCommand ## Fields - url: Where the command will be executed - method: HTTP Method - data: The json body payload - headers: HTTP headers to send to Raven - is_stream: If the request should be streamed - is_read_request: If this request is read_only """ @base_fields [ url: nil, method: nil, query_params: [], data: nil, headers: [], is_stream: false, is_read_request: false ] defmacro __using__(fields) do fields = @base_fields ++ fields quote do defstruct unquote(fields) end end defmacro command_type(fields) do fields_map = case fields do {:%{}, _, flist} -> Enum.into(flist, %{}) _ -> raise ArgumentError, "Fields must be a map!" end field_specs = Map.to_list(fields_map) quote do @type t :: %__MODULE__{ unquote_splicing(field_specs) } end end end