lib/query/query.ex

defmodule SurrealEx.Query do

  # Gives a filter´s list functions than will let us validate the args before prepare to query.
  @callback filters(arg :: any) :: [(any() -> {:ok, nil} | {:error, bitstring()})]
  @callback before(arg :: any) :: {:ok, any()} | {:error, any()}
  @callback query(arg :: any) :: String.t()
  @callback ok(response :: any) :: any()
  @callback error(response :: any) :: any()
  @optional_callbacks filters: 1, before: 1, ok: 1, error: 1

  defmacro __using__(opts) do
    conn_module = Keyword.get(opts, :conn)

    quote bind_quoted: [conn_module: conn_module]
    do

      alias SurrealEx.ArgsChecker

      def run(args) do
        SurrealEx.Query.QueryFlowRunner.run(__MODULE__, unquote(conn_module), args)
      end
      def run(args, token) do
        SurrealEx.Query.QueryFlowRunner.run(__MODULE__, unquote(conn_module), args, token)
      end

    end
  end

end