Current section
Files
Jump to
Current section
Files
lib/maru_swagger.ex
defmodule MaruSwagger do
use Maru.Middleware
alias MaruSwagger.ConfigStruct
def init(opts) do
ConfigStruct.from_opts(opts)
end
def call(%Plug.Conn{path_info: path_info}=conn, config = %ConfigStruct{}) do
case Maru.Router.Path.lstrip(path_info, config.path) do
{:ok, []} ->
resp =
generate(config)
|> Poison.encode!(pretty: config.pretty)
conn
|> Plug.Conn.put_resp_header("access-control-allow-origin", "*")
|> Plug.Conn.send_resp(200, resp)
|> Plug.Conn.halt
_ -> conn
end
end
def generate(module, version, prefix) do
%ConfigStruct{module: module, version: version, prefix: prefix} |> generate
end
def generate(config = %ConfigStruct{}) do
config.module
|> Maru.Builder.Routers.generate
|> Dict.fetch!(config.version)
|> Enum.sort(&(&1.path > &2.path))
|> Enum.map(&extract_endpoint(&1, config.prefix))
|> MaruSwagger.ResponseFormatter.format(config)
end
defp extract_endpoint(ep, prefix) do
params = ep |> MaruSwagger.ParamsExtractor.extract_params
method = case ep.method do
{:_, [], nil} -> "MATCH"
m -> m
end
%{
desc: ep.desc,
method: method,
path: prefix ++ ep.path,
params: params,
version: ep.version
}
end
end