Packages
mazurka
1.0.1
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
defp mazurka__scope(unquote(Utils.mediatype), unquote_splicing(Utils.arguments)) do
%{}
end
defoverridable mazurka__scope: unquote(length(Utils.arguments) + 1)
end
end
def define(var, {name, _, _}, block) when is_atom(name) do
define(var, name, block)
end
def define(var, name, block) when is_atom(name) do
bin_name = to_string(name)
block = replace_value(var, bin_name, block)
compile(name, block)
end
defp replace_value(var, name, []) do
var_get(var, name)
end
defp replace_value(var, name, [do: block]) do
replace_value(var, name, block)
end
defp replace_value(var, name, block) do
params_get = var_get(var, name)
Mazurka.Utils.postwalk(block, fn
({:&, _, [{:value, _, _}]}) ->
params_get
(other) ->
other
end)
end
defp var_get(var, name) do
quote do
unquote(var)[unquote(name)]
end
end
def compile(name, block) do
body = Macro.escape(get(name))
quote do
defmacrop unquote(name)() do
unquote(body)
end
defp mazurka__scope(unquote(Utils.mediatype), unquote_splicing(Utils.arguments)) do
unquote(Utils.scope) = super(unquote(Utils.mediatype), unquote_splicing(Utils.arguments))
Map.put(unquote(Utils.scope), unquote(name), unquote(block))
end
defoverridable mazurka__scope: unquote(length(Utils.arguments) + 1)
end
end
defp get(name) do
quote do
case Map.fetch(unquote(Utils.scope), unquote(name)) do
:error ->
raise RuntimeError, message: "variable #{inspect(unquote(name))} was not set before trying to use it"
{:ok, value} ->
value
end
end
end
end