Packages
riptide
0.5.0-beta9
0.5.2
0.5.1
0.5.0-beta9
0.5.0-beta8
0.5.0-beta7
0.5.0-beta6
0.5.0-beta5
0.5.0-beta4
0.5.0-beta3
0.5.0-beta2
0.5.0-beta11
0.5.0-beta10
0.5.0-beta
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-bd63a38
0.2.79
0.2.78
0.2.74
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A data first framework for building realtime applications
Current section
Files
Jump to
Current section
Files
lib/riptide/tree/tree.ex
defmodule Riptide.Tree do
defmacro __using__(_opts) do
quote do
Module.register_attribute(__MODULE__, :branches, accumulate: true)
import Riptide.Tree
@before_compile Riptide.Tree
end
end
defmacro __before_compile__(env) do
branches = Module.get_attribute(env.module, :branches)
quote do
def for_path(path) do
raise "Schema not defined for path #{inspect(path)}"
end
def all() do
unquote(branches)
end
end
end
defmacro branch(path, opts \\ []) do
{prefix, _rest} = Enum.split_while(path, &is_binary/1)
name =
Keyword.get(
opts,
:name,
prefix
|> Enum.map(&Regex.replace(~r/\W/, &1, "_"))
|> Enum.join("_")
)
columns =
Enum.map(path, fn
binary when is_binary(binary) -> :_
{atom, _, _} when is_atom(atom) -> atom
atom when is_atom(atom) -> atom
_ -> raise "Branch paths must be atoms or strings"
end)
branch =
Macro.escape(%Riptide.Tree.Branch{
name: name,
columns: columns,
schema:
case Code.eval_quoted(Keyword.get(opts, :schema, [])) do
{mod, _} when is_atom(mod) -> mod
_ -> nil
end
})
match =
case prefix do
[] -> quote do: _
_ -> quote do: [unquote_splicing(prefix) | rest]
end
quote do
@branches Macro.escape(unquote(branch))
def for_path(unquote(match)) do
unquote(branch)
end
end
end
end