1defmodule Maru.Struct.Resource do
2  @moduledoc false
3
4  alias Maru.Struct.Resource
5  alias Maru.Struct.Plug, as: MaruPlug
6
7  defstruct path:       [],
8            parameters: [],
9            plugs:      [],
10            helpers:    [],
11            version:    nil
12
13  @doc "make snapshot for current scope."
14  defmacro snapshot do
15    quote do
16      @resource
17    end
18  end
19
20  @doc "restore current scope by an snapshot."
21  defmacro restore(value) do
22    quote do
23      @resource unquote(value)
24    end
25  end
26
27  @doc "push path to current scope."
28  defmacro push_path(value) when is_list(value) do
29    quote do
30      %Resource{path: path} = resource = @resource
31      @resource %{
32        resource |
33        path: path ++ unquote(value),
34      }
35    end
36  end
37
38  defmacro push_path(value) do
39    quote do
40      %Resource{path: path} = resource = @resource
41      @resource %{
42        resource |
43        path: path ++ [unquote(value)],
44      }
45    end
46  end
47
48  @doc "push parameter to current scope."
49  defmacro push_param(value) do
50    quote do
51      %Resource{parameters: params} = resource = @resource
52      parameters =
53        case unquote(value) do
54          v when is_list(v) -> params ++ v
55          v                 -> params ++ [v]
56        end
57      @resource %{ resource | parameters: parameters }
58    end
59  end
60
61  @doc "push plug to current scope."
62  defmacro push_plug(value) do
63    quote do
64      %Resource{plugs: plugs} = resource = @resource
65      @resource %{
66        resource |
67        plugs: MaruPlug.merge(plugs, unquote(value)),
68      }
69    end
70  end
71
72  @doc "get endpoint version of current scope ."
73  defmacro get_version do
74    quote do
75      @resource.version
76    end
77  end
78
79  @doc "set endpoint version of current scope ."
80  defmacro set_version(value) do
81    quote do
82      @resource %{
83        @resource |
84        version: unquote(value)
85      }
86    end
87  end
88
89end
90