Packages
maru
0.12.2
0.14.0-pre.1
0.13.2
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
REST-like API micro-framework for elixir inspired by grape.
Current section
Files
Jump to
Current section
Files
lib/maru/struct/plug.ex
defmodule Maru.Struct.Plug do
@moduledoc false
defstruct name: nil,
plug: nil,
options: nil,
guards: true
@doc "make snapshot for current scope."
defmacro snapshot do
quote do
@plugs
end
end
@doc "restore current scope by an snapshot."
defmacro restore(value) do
quote do
@plugs unquote(value)
end
end
@doc "push plugs to current scope."
defmacro push(value) when is_list(value) do
quote do
@plugs unquote(__MODULE__).merge(@plugs, unquote(value))
end
end
defmacro push(value) do
quote do
@plugs unquote(__MODULE__).merge(@plugs, [unquote(value)])
end
end
@doc "return snapshot and clean current plugs stack."
defmacro pop do
quote do
try do
@plugs
after
@plugs []
end
end
end
@doc "merge and override plugs."
def merge(plugs, %__MODULE__{}=pipeline) do
merge(plugs, [pipeline])
end
def merge(plugs, pipelines) do
Enum.reduce(pipelines, plugs, fn x, acc ->
do_merge(acc, x, [])
end)
end
defp do_merge([], plug, result) do
result ++ [plug]
end
defp do_merge([%__MODULE__{name: nil}=h | t], plug, result) do
do_merge(t, plug, result ++ [h])
end
defp do_merge([%__MODULE__{name: n} | t], %__MODULE__{name: n}=plug, result) do
result ++ [plug] ++ t
end
defp do_merge([h | t], plug, result) do
do_merge(t, plug, result ++ [h])
end
end