Packages
maru
0.10.0
0.14.0-pre.1
0.13.2
0.13.1
0.13.0
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.0
0.5.1
0.5.0
0.4.1
0.4.0
0.3.1
0.3.0
0.2.10
0.2.9
0.2.8
0.2.7
0.2.6
0.2.5
REST-like API micro-framework for elixir inspired by grape.
Current section
Files
Jump to
Current section
Files
lib/mix/tasks/routes.ex
defmodule Mix.Tasks.Maru.Routes do
@mdouledoc """
Print routes for a `Maru.Router` module.
$ mix maru.routes
$ mix maru.routes MyApp.API
"""
use Mix.Task
def run(args) do
unless System.get_env("MIX_ENV") do
Mix.env(:dev)
end
Mix.Task.run "compile", args
cond do
module = List.first(args) ->
Module.concat("Elixir", module) |> generate_module([])
(servers = Maru.servers) != [] ->
for {module, _} <- servers do
generate_module(module, [])
end
Code.ensure_loaded?(Phoenix) ->
phoenix_module = Module.concat(Mix.Phoenix.base(), "Router")
for %{
__struct__: Phoenix.Router.Route,
kind: :forward,
path: path,
plug: module,
} <- phoenix_module.__routes__ do
try do
prefix = path |> String.split("/", trim: true)
generate_module(module, prefix)
rescue
UndefinedFunctionError -> nil
end
end
true -> nil
end
end
defp generate_module(module, prefix) do
config = (Application.get_env(:maru, module) || [])[:versioning] || []
adapter = Maru.Builder.Versioning.get_adapter(config[:using])
module.__routes__
|> Enum.sort_by(fn route -> route.version end)
|> Enum.map(&generate_route(&1, adapter, prefix))
|> Enum.map(&IO.puts/1)
end
defp generate_route(route, adapter, prefix) do
path = adapter.path_for_params(route.path, route.version)
format_version(route.version) <>
format_method(route.method) <>
format_path(prefix ++ path) <>
" " <> (route.desc || "")
end
defp format_version(nil), do: "nil" |> format_version
defp format_version(version) do
version |> String.ljust(5)
end
defp format_method({:_, [], nil}), do: ":match" |> format_method
defp format_method(method) do
method |> String.ljust(7)
end
defp format_path([]), do: "/"
defp format_path(p) do
func = fn
i when is_atom(i) -> ":#{i}"
i -> i
end
["" | p] |> Enum.map(func) |> Enum.join("/")
end
end