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