-
Notifications
You must be signed in to change notification settings - Fork 2.9k
/
phx.routes.ex
99 lines (73 loc) · 2.68 KB
/
phx.routes.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
88
89
90
91
92
93
94
95
96
97
98
99
defmodule Mix.Tasks.Phx.Routes do
use Mix.Task
alias Phoenix.Router.ConsoleFormatter
@shortdoc "Prints all routes"
@moduledoc """
Prints all routes for the default or a given router.
$ mix phx.routes
$ mix phx.routes MyApp.AnotherRouter
The default router is inflected from the application
name unless a configuration named `:namespace`
is set inside your application configuration. For example,
the configuration:
config :my_app,
namespace: My.App
will exhibit the routes for `My.App.Router` when this
task is invoked without arguments.
Umbrella projects do not have a default router and
therefore always expect a router to be given. An
alias can be added to mix.exs to automate this:
defp aliases do
[
"phx.routes": "phx.routes MyAppWeb.Router",
# aliases...
]
"""
@doc false
def run(args, base \\ Mix.Phoenix.base()) do
Mix.Task.run("compile", args)
Mix.Task.reenable("phx.routes")
{router_mod, opts} =
case OptionParser.parse(args, switches: [endpoint: :string, router: :string]) do
{opts, [passed_router], _} -> {router(passed_router, base), opts}
{opts, [], _} -> {router(opts[:router], base), opts}
end
router_mod
|> ConsoleFormatter.format(endpoint(opts[:endpoint], base))
|> Mix.shell().info()
end
defp endpoint(nil, base) do
loaded(web_mod(base, "Endpoint"))
end
defp endpoint(module, _base) do
loaded(Module.concat([module]))
end
defp router(nil, base) do
if Mix.Project.umbrella?() do
Mix.raise """
umbrella applications require an explicit router to be given to phx.routes, for example:
$ mix phx.routes MyAppWeb.Router
An alias can be added to mix.exs aliases to automate this:
"phx.routes": "phx.routes MyAppWeb.Router"
"""
end
web_router = web_mod(base, "Router")
old_router = app_mod(base, "Router")
loaded(web_router) || loaded(old_router) || Mix.raise """
no router found at #{inspect web_router} or #{inspect old_router}.
An explicit router module may be given to phx.routes, for example:
$ mix phx.routes MyAppWeb.Router
An alias can be added to mix.exs aliases to automate this:
"phx.routes": "phx.routes MyAppWeb.Router"
"""
end
defp router(router_name, _base) do
arg_router = Module.concat([router_name])
loaded(arg_router) || Mix.raise "the provided router, #{inspect(arg_router)}, does not exist"
end
defp loaded(module) do
if Code.ensure_loaded?(module), do: module
end
defp app_mod(base, name), do: Module.concat([base, name])
defp web_mod(base, name), do: Module.concat(["#{base}Web", name])
end