- Based on feed back from @mgeisler, update the kbd tag guidance in GEMINI.md to require wrapping each key in its own tag (e.g., `<kbd>Ctrl</kbd> + <kbd>S</kbd>`). - Apply this new convention to existing content in the `src` directory to ensure consistency.
7.2 KiB
Project Overview
This repository contains the source code for Comprehensive Rust, a family of
courses on Rust developed by Google, starting with Rust foundations, and
including deep dives into specialized topics like Android, Chromium, bare-metal
development, and concurrency. The project is a Rust workspace that leverages
mdbook to generate a course website.
Key Technologies
- Rust: The primary programming language for the course subject, custom tools, and examples.
- mdbook: A command-line tool to create books from Markdown files, used for generating the course website.
- Custom mdbook Preprocessors:
mdbook-courseandmdbook-exerciserare Rust binaries that extendmdbook's functionality, for example, to extract exercise starter code. cargo xtask: A custom binary within the workspace used for project automation, simplifying common development tasks.
Building and Running
The project uses cargo xtask for project-specific automation, like builds,
tests, and managing translations.
Setup
- Install Rust: Follow the instructions on https://rustup.rs/.
- Clone Repository:
git clone https://github.com/google/comprehensive-rust/ cd comprehensive-rust - Install Project Tools:
This is a necessary first step for working with this repository. It will install the correct versions of all tools used by the project.
cargo xtask install-tools
Commands
All commands are run using cargo xtask. Run cargo xtask --help for a full
list of options.
-
Serve the Course Locally: Starts a web server to view the course content.
cargo xtask serve [--language <ISO_639_language_code>] [--output <output_directory>](e.g.,
cargo xtask serve -l dafor the Danish translation) -
Build the Course: Creates a static version of the course in the
book/directory.cargo xtask build [--language <ISO_639_language_code>] [--output <output_directory>] -
Run Rust Snippet Tests: Tests all Rust code snippets included in the course material.
cargo xtask rust-tests -
Run Web Driver Tests: Executes web driver tests located in the
tests/directory.cargo xtask web-tests [--dir <book_html_directory>]
Development Conventions
- Project Automation:
cargo xtaskis the primary interface for common development tasks. - Course Content: Markdown files in the
src/directory, structured according tosrc/SUMMARY.md. - Code Formatting:
dprint fmtis used to format all source files according torustfmt.tomlanddprint.json. Note that you must first install the project tools withcargo xtask install-tools. - Contributions: Refer to
CONTRIBUTING.mdfor guidelines on contributing to the project. - Style: Refer to
STYLE.mdfor style guidelines. When making changes to Markdown files insrc/, always first readSTYLE.mdand follow its conventions. - GitHub Actions: The project uses composite GitHub Actions to simplify CI
workflows. These actions should be preferred over hand-written commands.
apt-get-install: This action efficiently installs Debian packages. It configuresdpkgandaptto skip documentation and translations, and ensures thatapt-get updateis run only once per job. This significantly speeds up CI runs.install-mdbook: A composite action to installmdbookand its dependencies, includingpandocandtexlive.setup-rust-cache: A composite action that configures theSwatinem/rust-cacheaction.
Markdown Conventions
-
Headings:
- H1 (
#): Used for the main title of each page. Each slide has exactly one title. - H2 (
##): Used for major sections. Slides do not use H2 headings to save vertical space; more slides are created instead. - H3 (
###): Used for sub-sections, but not on slides.
- H1 (
-
Emphasis:
- Bold (
**...**): Used to highlight key terms, commands, and for notes (e.g.,**Note:**). The colon (:) is included inside the bold text for notes. - Italic (
_..._): Used for general emphasis, titles of external articles, and for terms being defined.
- Bold (
-
Code:
- Inline Code (
`...`): Used for code snippets, file names, commands, type names, and language keywords. Rust fragments are formatted asrustfmtwould. - Code Blocks (
```...```): Fenced code blocks are used for multi-line code examples, annotated with a language identifier (e.g.,rust,c,ignore). - Interactive Code Blocks: Rust examples are made interactive with
editable. Examples that fail to compile are marked withcompile_failorshould_panic. - Diagrams: The
boblanguage identifier is used in code blocks to generate ASCII art diagrams. - Formatting Control: The
#[rustfmt::skip]attribute is used to preventrustfmtfrom formatting specific code blocks, though it is used rarely.
- Inline Code (
-
Lists:
- Bulleted Lists: Unordered lists are the primary way to lay out key points on slides.
- Glossary Format: The glossary uses a specific format with a colon and
backslash (
:\) after each term to create a hard line break for visual formatting.
-
Other Markdown Elements:
- Block Quotes (
> ...): Used sparingly for important notes, warnings, or supplementary information to draw attention. - Links: Both standard (
[text](url)) and reference-style ([text][label]) links are used. - Tables: Markdown tables are used to present structured data.
- Horizontal Rules (
---): Not used on slides.
- Block Quotes (
-
HTML Tags:
<details>: Used for collapsible "speaker notes".<kbd>: Used to denote keyboard keys. Each key in a combination must be wrapped in its own tag, e.g.,<kbd>Ctrl</kbd> + <kbd>S</kbd>.<style>: Used rarely for targeted custom CSS.<img>: Used to embed images.
-
Project-Specific Conventions:
- mdbook Includes: The
{{#include ...}}helper is used to include snippets from other files. - mdbook Segments: The
{{%segment ...%}}and{{%session ...%}}helpers are used for course structuring. - Frontmatter: Files start with YAML frontmatter (enclosed in
---) to provide metadata. - Doc Comments: Standard Rust doc comments (
///,//!) are used./// # Safetyis used to document safety preconditions forunsafecode. - Comments: HTML comments (
<!-- ... -->) are used for editor/translator instructions and content control (e.g.,mdbook-xgettext: skip).
- mdbook Includes: The
Project-Specific Technical Context
This section contains critical, non-obvious technical details about this project's tooling and environment that an AI assistant needs to know to perform its tasks correctly.
mdbook Behavior
- Isolated Code Snippets:
mdbooktreats each fenced Rust code block (e.g.,```rust ... ```) as a separate compilation unit. When analyzing a code snippet, treat it as a self-contained program. Do not assume it shares a scope or context with other snippets in the same file unless the surrounding text explicitly states otherwise.