Current section
Files
Jump to
Current section
Files
lib/format/api_blueprint.ex
defmodule APIDoc.Format.APIBlueprint do
@moduledoc ~S"""
"""
def format(document) do
"""
Format: 1A
#{document.servers |> Enum.map(&("HOST: " <> &1.url)) |> Enum.join("\n")}
# #{document.info.name}
#{document.info.description}
#{document.endpoints |> Enum.map(&paths(&1, document)) |> Enum.join("\n")}
"""
|> String.replace(~r/\n[\r\ \t]*\n[\r\ \t]*\n/, "\n\n")
end
defp paths(data, document, pre \\ "")
defp paths(%{path: path, endpoints: endpoints}, document, pre) do
path = pre <> format_path(path)
endpoints |> Enum.sort_by(&Enum.count(&1.path)) |> Enum.map(&paths(&1, document, path))
|> Enum.join("\n")
end
defp paths(data = %{id: api}, document, pre) do
path = pre <> format_path(data.path)
method = data.method |> to_string() |> String.upcase()
"""
## [#{path}]
### #{data.id} [#{method}]
#{Map.get(data, :description, data.summary)}
#{data.parameters |> Enum.map(¶m/1) |> Enum.join("\n")}
#{
data.responses |> Enum.sort_by(& &1.status) |> Enum.map(&endpoint(&1, document))
|> Enum.join("\n")
}
"""
end
defp format_path([]), do: ""
defp format_path(path) do
"/" <>
(path
|> Enum.map(&if(is_atom(&1), do: "{#{&1}}", else: &1))
|> Enum.join("/"))
end
defp param(%{name: name, type: type, description: description, example: example}) do
example = if example, do: ": #{inspect(example)}", else: ""
"+ #{name}#{example} (#{type}) - #{description}"
end
defp endpoint(%{status: status, content: content}, document) do
content
|> Enum.map(fn {type, data} -> endpoint(status, type, data, document) end)
|> Enum.join("\n")
end
defp endpoint(status, :"application/json", data, document) do
example =
document.schemas
|> Enum.find(&(Macro.to_string(&1.name) == data))
|> Map.get(:example)
|> Poison.encode!(pretty: true)
|> String.split("\n")
|> Enum.map(&(" " <> &1))
|> Enum.join("\n")
"+ Response #{status} (application/json)\n\n#{example}\n"
end
defp endpoint(status, type, data, _document) do
"+ Response #{status} (#{type})"
end
end