Packages
mazurka
1.0.7
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.3.39
0.3.38
0.3.37
0.3.36
0.3.35
0.3.34
0.3.33
0.3.32
0.3.31
0.3.30
0.3.29
0.3.28
0.3.27
0.3.26
0.3.25
0.3.24
0.3.23
0.3.22
0.3.21
0.3.20
0.3.19
0.3.18
0.3.17
0.3.16
0.3.15
0.3.14
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.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
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
hypermedia api toolkit
Current section
Files
Jump to
Current section
Files
lib/mazurka/resource/utils/scope.ex
defmodule Mazurka.Resource.Utils.Scope do
@moduledoc false
alias Mazurka.Resource.Utils
defmacro __using__(_) do
quote do
Module.register_attribute(__MODULE__, :mazurka_scope, accumulate: true)
@before_compile unquote(__MODULE__)
end
end
def define(var, name, block, type \\ :binary)
def define(var, {name, _, _}, block, type) when is_atom(name) do
define(var, name, block, type)
end
def define(var, name, block, :binary) when is_atom(name) do
bin_name = to_string(name)
block = transform_value(var, bin_name, block)
compile(name, block)
end
def define(var, name, block, :atom) when is_atom(name) do
block = transform_value(var, name, block)
compile(name, block)
end
defp transform_value(var, name, []) do
var_get(var, name)
end
defp transform_value(var, name, fun) do
quote do
(unquote(fun)).(unquote(var_get(var, name)))
end
end
defp var_get(var, name) do
quote do
unquote(var)[unquote(name)]
end
end
defmacro __before_compile__(env) do
scope = Module.get_attribute(env.module, :mazurka_scope) |> :lists.reverse()
values = Enum.flat_map(scope, fn({name, code}) ->
var = Macro.var(name, nil)
quote do
unquote(var) = unquote(code)
_ = unquote(var)
end
|> elem(2)
end)
map = Enum.map(scope, fn({n, _}) -> Macro.var(n, nil) end)
quote do
defp __mazurka_scope__(unquote(Utils.mediatype), unquote_splicing(Utils.arguments)) do
unquote_splicing(values)
{unquote_splicing(map)}
end
end
end
def compile(name, block) do
quote do
@mazurka_scope {unquote(name), unquote(Macro.escape(block))}
end
end
defmacro dump() do
scope = Module.get_attribute(__CALLER__.module, :mazurka_scope) |> :lists.reverse()
vars = Enum.map(scope, fn({n, _}) -> Macro.var(n, nil) end)
assigns = Enum.map(scope, fn({n, _}) -> quote(do: _ = unquote(Macro.var(n, nil))) end)
quote do
{unquote_splicing(vars)} = unquote(Utils.scope)
unquote_splicing(assigns)
end
end
end