1defmodule Maru.Builder.Pipeline do 2 @moduledoc """ 3 General DSLs for parsing router. 4 """ 5 6 alias Maru.Struct.Plug, as: MaruPlug 7 8 @doc """ 9 Push a `Plug` struct to current resource scope. 10 """ 11 defmacro plug(plug) 12 13 defmacro plug({:when, _, [plug, guards]}) do 14 do_plug(nil, plug, [], guards) 15 end 16 17 defmacro plug(plug) do 18 do_plug(nil, plug, [], true) 19 end 20 21 @doc """ 22 Push a `Plug` struct with options and guards to current resource scope. 23 """ 24 defmacro plug(plug, opts) 25 26 defmacro plug(plug, {:when, _, [opts, guards]}) do 27 do_plug(nil, plug, opts, guards) 28 end 29 30 defmacro plug(plug, opts) do 31 do_plug(nil, plug, opts, true) 32 end 33 34 @doc """ 35 Push a overridable `Plug` struct to current resource scope. 36 """ 37 defmacro plug_overridable(name, plug) 38 39 defmacro plug_overridable(name, {:when, _, [plug, guards]}) do 40 do_plug(name, plug, [], guards) 41 end 42 43 defmacro plug_overridable(name, plug) do 44 do_plug(name, plug, [], true) 45 end 46 47 @doc """ 48 Push a overridable `Plug` struct with options and guards to current resource scope. 49 """ 50 defmacro plug_overridable(name, plug, opts) 51 52 defmacro plug_overridable(name, plug, {:when, _, [opts, guards]}) do 53 do_plug(name, plug, opts, guards) 54 end 55 56 defmacro plug_overridable(name, plug, opts) do 57 do_plug(name, plug, opts, true) 58 end 59 60 defp do_plug(name, plug, opts, guards) do 61 quote do 62 MaruPlug.push(%MaruPlug{ 63 name: unquote(name), 64 plug: unquote(plug), 65 options: unquote(opts), 66 guards: unquote(Macro.escape(guards)), 67 }) 68 end 69 end 70 71end 72