Metadata-Version: 2.1
Name: sphinxcontrib-rust
Version: 0.6.0
Summary: Sphinx extension for documenting Rust projects
Home-page: https://gitlab.com/munir0b0t/sphinxcontrib-rust
Author: Munir Contractor
Classifier: Development Status :: 4 - Beta
Classifier: Framework :: Sphinx :: Domain
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Programming Language :: Rust
Classifier: Topic :: Documentation :: Sphinx
Requires-Python: >=3.9
Description-Content-Type: text/plain
License-File: LICENSE
Requires-Dist: sphinx<9,>=7
Requires-Dist: myst-parser<4,>=3
Provides-Extra: dev
Requires-Dist: black; extra == "dev"
Requires-Dist: pylint; extra == "dev"
Requires-Dist: pytest-cov; extra == "dev"
Requires-Dist: sphinx_rtd_theme; extra == "dev"

==================
Sphinxcontrib-rust
==================

.. warning::

   | This project is a beta project. It will work with existing Rust docstrings with some minor tweaks, but there
     may be breaking changes between minor version releases.
   | See :doc:`docs/compatibility` for writing markdown syntax compatible with both rustdoc and Sphinx.
   | See :doc:`docs/limitations` for known limitations compared to rustdoc.

This is a `Sphinx`_ extension for integrating Rust programming language projects in Sphinx builds. You can read this
documentation on `Gitlab Pages`_ or `readthedocs`_.

.. _`Gitlab Pages`: https://munir0b0t.gitlab.io/sphinxcontrib-rust
.. _`readthedocs`: https://sphinxcontrib-rust.readthedocs.io/en/latest/

Motivation
----------

This is primarily meant for teams and projects that are already using Sphinx as a documentation build tool, and would
like to include documentation for Rust projects in it along with Python, C and other languages.

Using the extension adds the following functionality:

1. Rust specific :doc:`directives <docs/directives>` and :doc:`roles <docs/roles>` that can be used to link and
   cross-reference rustdoc comments.
2. rustdoc comments may be written in reStructuredText.
3. Various Sphinx features and extensions can be used to generate and publish the docs.

This is not a replacement for `rustdoc`_, and since rustdoc is a part of the Rust language itself, it will not have all
the same features as `rustdoc`_.

The goal is to provide a way for teams and projects using multiple languages to publish a single, consolidated
documentation and use this, along with rustdoc, as part of the documentation workflow.

See :doc:`docs/limitations` for some cases where the tool will not work the same as rustdoc and
:doc:`docs/compatibility` for any tweaks required to make the tool work with existing docstrings.

.. _`usage`:

How to use
----------

Installation
++++++++++++

There are two components that are required for this to work

1. The ``sphinx-rustdocgen`` Rust crate for extracting the docs.
2. The ``sphinxcontrib_rust`` Python package, which is a Sphinx extension.

Both components are installed when installing the Python package with

.. code-block::

   pip install sphinxcontrib-rust

The installation will check for ``cargo`` in the ``$PATH`` environment variable and will use that to build and install
the Rust executable.

The executable is built with the Rust code shipped with the Python package. This ensures that the Rust executable and
Python package are always compatible with each other.

Make sure that the directory where ``cargo`` installs the executable is in ``$PATH`` as well. If the default
installation directory is not part of the ``$PATH`` environment, the installed executable should be specified in the
Sphinx configuration with ``rust_rustdocgen`` option.

The Rust executable may also be installed independently from crates.io. However, it has limited use outside of the
extension and the interface is designed for programmatic use rather than interactive use.

With reStructuredText
+++++++++++++++++++++

To use the extension with rst rustdoc comments, simply add the extension to the ``conf.py`` file. The various
configuration options supported by the extension, along with their defaults, are documented below.

.. code-block:: python

   extensions = ["sphinxcontrib_rust"]
   rust_crates = {
       "my_crate": ".",
       "my_crate_derive": "my-crate-derive",
   }
   rust_doc_dir = "docs/crates/"

This will generate the documentation from your Rust crates and put them in the ``docs/crates/<crate_name>`` directories.
You can link against the documentation in your ``toctree`` by specifying the path to ``lib`` file and any executables.
See :doc:`docs/including` for more details.

.. code-block::

   .. toctree::

      docs/crates/my_crate/main
      docs/crates/my_crate/lib

The extension also adds various roles for Rust items. The roles can be used within the Sphinx documentation and also
within the docstrings themselves. The roles can even be used in docstrings of a different language that is part of
the same Sphinx project. The roles are documented in :doc:`docs/roles`.

The extension also provides various :doc:`docs/directives` and :doc:`docs/indices` that can be used in the documentation.

.. _`md usage`:

With Markdown
+++++++++++++

To use the extension with markdown rustdoc comments, add the extension to the ``conf.py`` file and also add the
`myst-parser`_ extension. Sphinx also needs to be `configured for Markdown builds`_.

Using various extensions for myst-parser, existing docstrings can be rendered with Sphinx with minimal changes required.
See :doc:`docs/compatibility` for details on how to get compatibility with various Rust markdown extensions and write
docstrings that can work with both rustdoc and Sphinx.

The various configuration options for the Rust extension, along with their defaults, are documented below. Also see
the `configuration options for MyST`_ to customize the markdown.

.. code-block:: python

   extensions = ["sphinxcontrib_rust", "myst_parser"]
   source_suffix = {
       ".rst": "restructuredtext",
       ".md": "markdown",
       ".txt": "markdown", # Optional
   }
   # See docs/compatibility for details on these extensions.
   myst_enable_extensions = {
       "colon_fence",
       "html_admonition",
       "replacements",
       "smartquotes",
       "strikethrough",
       "tasklist",
   }
   rust_crates = {
       "my_crate": ".",
       "my_crate_derive": "my-crate-derive",
   }
   rust_doc_dir = "docs/crates/"


This enables all the same roles and indexes as with rst. Use the `myst-parser syntax`_ for the roles.

Options
+++++++

Options are simply Python variables set in the ``conf.py`` file. Most options can be provided as a global value or a
dict of values per crate, with the crate name as the key. The options that are global only are listed separately below.

:rust_crates: (Required) A dict of crate names and their source code directories.
              This must be a dict even for a single crate. It determines which
              crates are documented. The directory should be the one which contains
              the ``Cargo.toml`` file for the crate and each crate in the workspace
              must be listed explicitly.
:rust_doc_dir: (Required) A directory under which to write the docs for all crates,
               or a dict of directory for each crate name. The directories will be
               read by Sphinx during the build, so they must be part of the source
               tree and not under the build directory. The build process will create
               a directory with the crate name under this, even when specified per
               crate.
:rust_rustdoc_fmt: Either ``rst`` or ``md``. (Default: ``rst``)
:rust_visibility: Only includes documentation and indexes for items with visibility greater than or equal to the
                  setting. The value can be ``pub``, ``crate`` or ``pvt``. Visibility restrictions like ``super`` and
                  ``in <path>`` are not supported currently and are treated as private. (Default: ``pub``).
:rust_strip_src: Whether to remove the ``src/`` directory when creating output files or not.
                 The default is ``True``, since that was the initial behavior. So,
                 instead of creating output files as ``<crate_name>/src/<mod_name>.rst``,
                 the output files are created as ``<crate_name>/<mod_name>.rst``, effectively
                 removing ``src/`` from the paths. Set to ``False`` for crates that use a
                 different path. (Default: True)

The below options are global options, and cannot be specified per crate.

:rust_generate_mode: One of ``always``, ``skip`` or ``changed``. If set to
                     ``always``, all documents are regenerated. If set to ``skip``,
                     the docs are not regenerated at all. If set to ``changed``,
                     only docs whose source files have been modified since they
                     were last modified are regenerated. (Default: ``changed``)
:rust_rustdocgen: The path to the ``sphinx-rustdocgen`` executable to use.
                  The path must be an absolute path or relative to Sphinx's
                  working directory. (Default: Obtained from the ``$PATH``
                  environment variable.)

.. _`Sphinx`: https://www.sphinx-doc.org/en/master/index.html
.. _`myst-parser`: https://myst-parser.readthedocs.io/en/latest/index.html
.. _`configured for Markdown builds`: https://www.sphinx-doc.org/en/master/usage/markdown.html
.. _`configuration options for MyST`: https://myst-parser.readthedocs.io/en/latest/configuration.html
.. _`myst-parser syntax`:
   https://myst-parser.readthedocs.io/en/latest/syntax/roles-and-directives.html#roles-an-in-line-extension-point
.. _rustdoc: https://doc.rust-lang.org/rustdoc/index.html

.. _details:

.. toctree::
   :caption: Detailed docs
   :maxdepth: 2
   :glob:

   docs/including
   docs/roles
   docs/directives
   docs/indices
   docs/limitations
   docs/compatibility
   docs/developing
   docs/sphinx-rustdocgen
   docs/sphinx-extension
   CONTRIBUTING
