/
voodoo.ex
87 lines (71 loc) · 2.24 KB
/
voodoo.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
defmodule Voodoo do
# @moduledoc """
# Declares a config-overrideable router.
# ```
# use Voodoo, otp_app: :myapp
# ```
# """
@doc """
Generates a reverse router function with the given name based upon a
compiled(!) phoenix router module.
Must be used outside of the router module, or else the router won't
be compiled yet and we won't be able to look up the routes.
Generated function wraps the existing phoenix helpers.
```
defmodule MyAppWeb.Router do
use MyAppWeb, :router
# ...
end
defmodule MyAppWeb.Router.Reverse do
import Voodoo, only: [def_reverse_router: 2]
def_reverse_router :path, for: MyAppWeb.Router
end
```
"""
defmacro def_reverse_router(name, opts) do
quote do
require Voodoo.Reverse
Voodoo.Reverse.def_reverse_router(unquote(name), unquote(opts))
end
end
@doc """
Turns a Conn or Socket into the name of the router that routed it.
"""
@spec router(Conn.t() | Socket.t()) :: module
def router(%{private: %{phoenix_router: router}}), do: router
def router(%{__struct__: _, router: router}), do: router
# defmacro __using__(options) do
# otp_app = Keyword.fetch!(options, :otp_app)
# caller = __CALLER__
# Module.register_attribute(caller.module, :otp_app)
# Module.register_attribute(caller.module, :voodoo_children, accumulate: true)
# quote do
# @otp_app unquote(otp_app)
# import Voodoo
# # @before_compile {:before_compile, {
# unquote(before_compile_macro(caller))
# end
# end
# defp before_compile_macro(caller) do
# quote do
# defmacro __before_compile__(env) do
# unquote(using_macro(caller, env))
# end
# end
# end
# defp using_macro(caller, env) do
# # quote do
# # defmacro __using__(_opts) do
# # end
# # end
# end
# defp voodoo_child(params) do
# quote do
# @voodoo_children unquote(params)
# end
# end
# defmacro get(path, controller, action, opts \\ []), do: voodoo_child([:get, path, controller, action])
# defmacro scope(opts, list), do: voodoo_child(opts, list)
# defmacro scope(path, opts, list), do: voodoo_child(path, opts, list)
# defmacro scope(path, alias, opts, list), do: voodoo_child(path, alias, opts, list)
end