defmodule Mix.Tasks.Bundlex.Doxygen do
@shortdoc "Generates doxygen documentation for Bundlex project"
@moduledoc """
#{@shortdoc}
Accepts the following command line arguments:
- `--yes`, `-y` - skips confirmation prompt and overwrites existing meta files
- `--no`, `-n` - skips confirmation prompt and does not overwrite existing meta files
"""
use Mix.Task
alias Bundlex.{Doxygen, Output, Project}
alias Bundlex.Helper.MixHelper
@impl Mix.Task
def run(args) do
{:ok, _apps} = Application.ensure_all_started(:bundlex)
skip_overwrite_check? = "-y" in args or "--yes" in args
always_overwrite? = "-n" in args or "--no" in args
if skip_overwrite_check? and always_overwrite? do
Mix.raise("Cannot use both --yes and --no options")
end
app = MixHelper.get_app!()
project = get_project(app)
doxygen = Doxygen.doxygen(project)
Doxygen.generate_doxyfile(doxygen)
Doxygen.generate_doxygen_documentation(doxygen)
if skip_overwrite_check? do
Doxygen.generate_hex_page(doxygen)
else
overwrite? =
always_overwrite? or Mix.shell().yes?("Do you want to overwrite existing hex page?")
if overwrite? do
Doxygen.generate_hex_page(doxygen)
else
Output.info("Skipping hex page generation")
end
end
unless page_included?(doxygen.page_path) do
example_docs = """
defp docs do
[
extras: [
"#{doxygen.page_path}",
...
],
...
]
end
"""
Output.info("""
Doxygen documentation page is not included in the project docs.
Add the following snippet to your mix.exs file:
#{example_docs}
""")
end
end
defp get_project(app) do
with {:ok, project} <- Project.get(app) do
project
else
{:error, reason} ->
Output.raise("Cannot get project for app: #{inspect(app)}, reason: #{inspect(reason)}")
end
end
defp page_included?(doxygen_page) do
config = Mix.Project.config()
with {:ok, docs} <- Keyword.fetch(config, :docs),
{:ok, extras} <- Keyword.fetch(docs, :extras) do
doxygen_page in extras
else
:error -> false
end
end
end