Packages
mazurka
0.3.32
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/partial.ex
defmodule Mazurka.Partial do
defmacro __using__(_) do
quote do
import unquote(__MODULE__)
unquote_splicing(Mazurka.Compiler.Kernel.imports)
end
end
defmacro defpartial(name, [do: content]) do
quote bind_quoted: [
name: Macro.escape(name, unquote: true),
content: Macro.escape(content, unquote: true)
] do
name = case name do
{direct, _, _} -> direct
_ -> name
end
def unquote(name)(unquote_splicing(Mazurka.Partial.args)) do
Mazurka.Partial.__exec__(name, unquote(content))
end
# BACKWARD COMPATIBILITY WITH MARKDOWN
def unquote(:"#{name}_partial")(unquote_splicing(Mazurka.Partial.args)) do
unquote(name)(unquote_splicing(Mazurka.Partial.args))
end
end
end
defmacro __exec__(name, content) do
parent = __CALLER__.module
mod = [parent, "Etude" <> to_string(:erlang.phash2({name, content}))] |> Module.concat()
content
|> Mazurka.Compiler.Utils.expand(__CALLER__)
|> name_fun()
|> Etude.Compiler.elixir_to_etude(parent)
|> Mazurka.Compiler.compile_etude(mod, __CALLER__)
quote do
unquote(mod).exec_partial(unquote_splicing(args))
end
end
def args do
[:state__, :resolve__, :req__, :scope__, :props__]
|> Enum.map(&(Macro.var(&1, nil)))
end
defp name_fun(content) do
[exec: quote do
res = unquote(content)
res
end]
end
end