| # What is rustdoc? | |
| The standard Rust distribution ships with a tool called `rustdoc`. Its job is | |
| to generate documentation for Rust projects. On a fundamental level, Rustdoc | |
| takes as an argument either a crate root or a Markdown file, and produces HTML, | |
| CSS, and JavaScript. | |
| ## Basic usage | |
| Let's give it a try! Create a new project with Cargo: | |
| ```bash | |
| $ cargo new docs --lib | |
| $ cd docs | |
| ``` | |
| In `src/lib.rs`, Cargo has generated some sample code. Delete | |
| it and replace it with this: | |
| ```rust | |
| /// foo is a function | |
| fn foo() {} | |
| ``` | |
| Let's run `rustdoc` on our code. To do so, we can call it with the path to | |
| our crate root like this: | |
| ```bash | |
| $ rustdoc src/lib.rs | |
| ``` | |
| This will create a new directory, `doc`, with a website inside! In our case, | |
| the main page is located in `doc/lib/index.html`. If you open that up in | |
| a web browser, you will see a page with a search bar, and "Crate lib" at the | |
| top, with no contents. | |
| You can also use `cargo doc` to generate documentation for the whole project. | |
| See [Using rustdoc with Cargo](#using-rustdoc-with-cargo). | |
| ## Configuring rustdoc | |
| There are two problems with this: first, why does it | |
| think that our crate is named "lib"? Second, why does it not have any | |
| contents? | |
| The first problem is due to `rustdoc` trying to be helpful; like `rustc`, | |
| it assumes that our crate's name is the name of the file for the crate | |
| root. To fix this, we can pass in a command-line flag: | |
| ```bash | |
| $ rustdoc src/lib.rs --crate-name docs | |
| ``` | |
| Now, `doc/docs/index.html` will be generated, and the page says "Crate docs." | |
| For the second issue, it is because our function `foo` is not public; `rustdoc` | |
| defaults to generating documentation for only public functions. If we change | |
| our code... | |
| ```rust | |
| /// foo is a function | |
| pub fn foo() {} | |
| ``` | |
| ... and then re-run `rustdoc`: | |
| ```bash | |
| $ rustdoc src/lib.rs --crate-name docs | |
| ``` | |
| We now have some generated documentation. Open up `doc/docs/index.html` and | |
| check it out! It should show a link to the `foo` function's page, which | |
| is located at `doc/docs/fn.foo.html`. On that page, you'll see the "foo is | |
| a function" we put inside the documentation comment in our crate. | |
| ## Using rustdoc with Cargo | |
| Cargo also has integration with `rustdoc` to make it easier to generate | |
| docs. Instead of the `rustdoc` command, we could have done this: | |
| ```bash | |
| $ cargo doc | |
| ``` | |
| If you want `cargo` to automatically open the generated documentation, you can use: | |
| ```bash | |
| $ cargo doc --open | |
| ``` | |
| Internally, `cargo doc` calls out to `rustdoc` like this: | |
| ```bash | |
| $ rustdoc --crate-name docs src/lib.rs -o <path>/docs/target/doc -L | |
| dependency=<path>/docs/target/debug/deps | |
| ``` | |
| You can see this with `cargo doc --verbose`. | |
| It generates the correct `--crate-name` for us, as well as pointing to | |
| `src/lib.rs`. But what about those other arguments? | |
| - `-o` controls the *o*utput of our docs. Instead of a top-level | |
| `doc` directory, notice that Cargo puts generated documentation under | |
| `target`. That is the idiomatic place for generated files in Cargo projects. | |
| - `-L` flag helps rustdoc find the dependencies your code relies on. | |
| If our project used dependencies, we would get documentation for them as well! | |
| ## Outer and inner documentation | |
| The `///` syntax is used to document the item present after it. | |
| That's why it is called an outer documentation. | |
| There is another syntax: `//!`, which is used to document the | |
| item it is present inside. It is called an inner documentation. | |
| It is often used when documenting the entire crate, | |
| because nothing comes before it: it is the root of the crate. | |
| So in order to document an entire crate, you need to use `//!` syntax. | |
| For example: | |
| ``` rust | |
| //! This is my first rust crate | |
| ``` | |
| When used in the crate root, it documents the item it is inside, | |
| which is the crate itself. | |
| For more information about the `//!` syntax, see [the Book]. | |
| [the Book]: https://doc.rust-lang.org/book/ch14-02-publishing-to-crates-io.html#commenting-contained-items | |
| ## Using standalone Markdown files | |
| `rustdoc` can also generate HTML from standalone Markdown files. Let' s | |
| give it a try: create a `README.md` file with these contents: | |
| ````text | |
| # Docs | |
| This is a project to test out `rustdoc`. | |
| [Here is a link!](https://www.rust-lang.org) | |
| ## Example | |
| ```rust | |
| fn foo() -> i32 { | |
| 1 + 1 | |
| } | |
| ``` | |
| ```` | |
| And call `rustdoc` on it: | |
| ```bash | |
| $ rustdoc README.md | |
| ``` | |
| You will find an HTML file in `docs/doc/README.html` generated from its | |
| Markdown contents. | |
| Cargo currently does not understand standalone Markdown files, unfortunately. | |
| ## Summary | |
| This covers the simplest use-cases of `rustdoc`. The rest of this book will | |
| explain all of the options that `rustdoc` has, and how to use them. |