1 Introducing Rust
1.1 Where is Rust used?
1.2 Advocating for Rust at work
1.3 A taste of the language
1.4 Downloading the book’s source code
1.5 What does Rust look and feel like?
1.6 What is Rust?
1.7 Rust’s big features
1.8 Downsides of Rust
1.9 TLS security case studies
1.10 Where does Rust fit best?
1.11 Rust’s hidden feature: Its community
1.12 Rust phrase book
Part 1 Rust language distinctives
2 Language foundations
2.1 Creating a running program
2.2 A glance at Rust’s syntax
2.3 Numbers
2.4 Flow control
2.5 Defining functions
2.6 Using references
2.7 Project: Rendering the Mandelbrot set
2.8 Advanced function definitions
2.9 Creating grep-lite
2.10 Making lists of things with arrays, slices, and vectors
2.11 Including third-party code
2.12 Supporting command-line arguments
2.13 Reading from files
2.14 Reading from stdin
3 Compound data types
3.1 Using plain functions to experiment with an API
3.2 Modeling files with struct
3.3 Adding methods to a struct with impl
3.4 Returning errors
3.5 Defining and making use of an enum
3.6 Defining common behavior with traits
3.7 Exposing your types to the world
3.8 Creating inline documentation for your projects
4 Lifetimes, ownership, and borrowing
4.1 Implementing a mock CubeSat ground station
4.2 Guide to the figures in this chapter
4.3 What is an owner? Does it have any responsibilities?
4.4 How ownership moves
4.5 Resolving ownership issues
Part 2 Demystifying systems programming
5 Data in depth
5.1 Bit patterns and types
5.2 Life of an integer
5.3 Representing decimal numbers
5.4 Floating-point numbers
5.5 Fixed-point number formats
5.6 Generating random probabilities from random bytes
5.7 Implementing a CPU to establish that functions are also data
6 Memory
6.1 Pointers
6.2 Exploring Rust’s reference and pointer types
6.3 Providing programs with memory for their data
6.4 Virtual memory
7 Files and storage
7.1 What is a file format?
7.2 Creating your own file formats for data storage
7.3 Implementing a hexdump clone
7.4 File operations in Rust
7.5 Implementing a key-value store with a log-structured, append-only storage architecture
7.6 Actionkv v1: The front-end code
7.7 Understanding the core of actionkv: The libactionkv crate
8 Networking
8.1 All of networking in seven paragraphs
8.2 Generating an HTTP GET request with reqwest
8.3 Trait objects
8.4 TCP
8.5 Ergonomic error handling for libraries
8.6 MAC addresses
8.7 Implementing state machines with Rust’s enums
8.8 Raw TCP
8.9 Creating a virtual networking device
8.10 “Raw” HTTP
9 Time and timekeeping
9.1 Background
9.2 Sources of time
9.3 Definitions
9.4 Encoding time
9.5 clock v0.1.0: Teaching an application how to tell the time
9.6 clock v0.1.1: Formatting timestamps to comply with ISO 8601 and email standards
9.7 clock v0.1.2: Setting the time
9.8 Improving error handling
9.9 clock v0.1.3: Resolving differences between clocks with the Network Time Protocol (NTP)
10 Processes, threads, and containers
10.1 Anonymous functions
10.2 Spawning threads
10.3 Differences between closures and functions
10.4 Procedurally generated avatars from a multithreaded parser and code generator
10.5 Concurrency and task virtualization
11 Kernel
11.1 A fledgling operating system (FledgeOS)
11.2 Fledgeos-0: Getting something working
11.3 fledgeos-1: Avoiding a busy loop
11.4 fledgeos-2: Custom exception handling
11.5 fledgeos-3: Text output
11.6 fledgeos-4: Custom panic handling
12 Signals, interrupts, and exceptions
12.1 Glossary
12.2 How interrupts affect applications
12.3 Software interrupts
12.4 Hardware interrupts
12.5 Signal handling
12.6 Handling signals with custom actions
12.7 Sending application-defined signals
12.8 Ignoring signals
12.9 Shutting down from deeply nested call stacks
12.10 A note on applying these techniques to platforms without signals
12.11 Revising exceptions