Packages
maru
0.13.0
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/resource/maru_plug.ex
alias Maru.Resource
defmodule Resource.MaruPlug do
@moduledoc false
defstruct name: nil,
plug: nil,
options: nil,
guards: true
@doc "push plug to current plugs stack."
def push(plug_or_plugs, %Macro.Env{module: module}) do
plugs = Module.get_attribute(module, :plugs)
new_plugs = merge(plugs, plug_or_plugs)
Module.put_attribute(module, :plugs, new_plugs)
end
@doc "return snapshot and clean current plugs stack."
def pop(%Macro.Env{module: module}) do
plugs = Module.get_attribute(module, :plugs)
Module.get_attribute(module, :plugs, [])
plugs
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