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