Current section
Files
Jump to
Current section
Files
lib/lazymaru.ex
defmodule Lazymaru do
use Application
def start(_type, _args) do
Lazymaru.Supervisor.start_link
end
defp decode_params([{:__block__, _, params}]), do: params |> decode_params
defp decode_params(params) do
for {required, _, [param, options]} <- params do
[ %{name: param},
case required do
:requires -> %{required: true}
:optional -> %{required: false}
end,
case options[:type] do
{:__aliases__, _, [type]} ->
%{type: type |> to_string |> String.downcase}
_ -> %{}
end,
case options[:regexp] do
{:sigil_r, _, [{_, _, [reg]}, []]} -> %{regexp: reg}
_ -> %{}
end,
case options[:range] do
{:.., _, [from, to]} -> %{range: "#{from}..#{to}"}
_ -> %{}
end,
case options[:default] do
nil -> %{}
value -> %{default: value}
end
] |> Enum.reduce fn(x, y) -> Dict.merge(x, y) end
end
end
def gen_docs(module) do
for i <- module.endpoints do
params = case i.params_block do
nil -> %{}
{:__block__, [], [ _ | params]} ->
params |> decode_params
end
path = case i.path do
[] -> "/"
any -> ["" | any]
|> Enum.map(fn p when is_atom(p) -> ":#{p}"
p when is_binary(p) -> p
end)
|> Path.join
end
"METHOD: <%= method %>\nPATH: <%= path %>\n<%= for param <- params do %>PARAM: <%= param.name %>\n<% end %><%= if desc do %>DESC:<%= desc %><% end %>"
|> EEx.eval_string([method: i.method, path: path, desc: i.desc, params: params])
end |> Enum.join("\n\n") |> IO.puts
end
end