defmodule ActiveMemory.Query do @moduledoc """ ## The `match` query syntax Using the `match` macro you can structure a basic query. ```elixir query = match(:department == "sales" or :department == "marketing" and :start_date > last_month) Store.select(query) ``` """ defmacro match(query) do reduce(query) end defp reduce({operand, _meta, [lhs, rhs]}) do quote do {unquote(operand), unquote(reduce(lhs)), unquote(reduce(rhs))} end end defp reduce({atom, meta, _} = ast) when is_atom(atom) and is_list(meta) do quote do unquote(ast) end end defp reduce(value) when is_atom(value), do: value defp reduce(value) when is_binary(value), do: value defp reduce(value) when is_integer(value), do: value end