You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
programming-rust-examples/README.md

159 lines
6.5 KiB
Markdown

7 years ago
# Code Examples for _Programming Rust_
This repository contains complete code for the larger example programs from the
book “Programming Rust”, by Jim Blandy, Jason Orendorff, and Leonora Tindall.
7 years ago
Each subdirectory is a distinct Rust project, with its own Cargo.toml file. You
should be able to enter each directory and use `cargo build` and `cargo test`.
For those projects that define programs, `cargo run` should run them.
6 years ago
The example code in this directory and its subdirectories is licensed under the
terms of the MIT license. See [LICENSE-MIT](LICENSE-MIT) for details.
7 years ago
## Chapter 2: A Tour of Rust
- The `gcd` directory holds the command-line program for computing the greatest
common denominator of a list of numbers.
- The `actix-gcd` directory holds the code for the simple web service,
implemented using the [`actix-web`] framework, that computes
greatest common denominators.
Note that the code shown here has been updated to use a newer
version of `actix-web` than shown in the book, to address security
holes in earlier versions of the framework.
7 years ago
- the Mandelbrot plotting program has its own repository, at
7 years ago
`https://github.com/ProgrammingRust/mandelbrot`. This repository contains
several branches, each showing a different implementation strategy. The
`single-threaded` branch holds the code for the single-threaded version, and
the `bands` branch holds the multi-threaded version. Chapter 19,
“Concurrency”, shows several other approaches, which appear on other branches;
see the repository's [README.md][mandel-readme] file for details.
[`actix-web`]: https://actix.rs/
7 years ago
## Chapter 8: Crates and Modules
- We did not actually write a fern simulator. Please accept our sincere apology
for this feckless deception. But the skeleton of modules and definitions we
show in the book is in the `fern_sim` subdirectory.
## Chapter 9: Structs
- The `queue` directory holds a library that defines the `Queue` type,
representing a queue of `char` values.
- The `generic-queue` directory holds code for generic `Queue` type.
## Chapter 10: Enums and Patterns
- The `binary-tree` directory holds the source code for the `BinaryTree` type
that appears in the “Generic Enums” and “Populating a Binary Tree” sections.
## Chapter 12: Operator Overloading
- The `complex` directory holds the `Complex` type used as a running example
throughout the chapter.
- The `interval` directory holds the `Interval` type for which the book
implements the `std::cmp::PartialOrd` trait.
## Chapter 14: Closures
- The 'basic-router' directory holds the `BasicRouter` type used as an example
in the “Callbacks” section.
## Chapter 15: Iterators
- The `binary-tree` directory holds the implementation of the `Iterator` trait
for the `BinaryTree` type originally defined in the “Enums and Patterns”
chapter.
## Chapter 17: Strings and Text
- The `complex` directory includes the implementation of the `std::fmt::Display`
formatting trait for a complex number type, shown in the section “Formatting
Your Own Types”.
## Chapter 18: Input and Output
- The `grep` directory holds the simple grep-like program shown in the section
“Reading Lines”.
- The `copy` directory holds the program for copying directory trees from the
section “Reading Directories”, including the additions shown in the next
section, “Platform-Specific Features”.
- The `echo-server` directory holds the simple network service shown in the
“Networking” section.
- The `http-get` directory holds the command-line program that uses the
`reqwest` crate to carry out an HTTP request.
## Chapter 19: Concurrency
- The search engine used as a running example throughout the book has its own
repository, at `https://github.com/ProgrammingRust/fingertips`.
- The Mandelbrot set plotter discussed in the section “Revisiting the Mandelbrot
Set” also has its own repository, at `https://github.com/ProgrammingRust/mandelbrot`.
The repository includes several branches exploring different implementations;
see the repository's [README.md][mandel-readme] file for details.
[mandel-readme]: https://github.com/ProgrammingRust/mandelbrot/blob/master/README.md
## Chapter 20: Asynchronous Programming
- The `cheapo-request` directory uses `async-std`'s asynchronous networking
functions and the `block_on` executor function to make a bare-bones HTTP
request.
- The `many-requests` directory makes several requests concurrently on a single
thread, using `async-std`'s `spawn_local`.
- The `many-requests-surf` directory does the same using `surf`, an open-source
asynchronous HTTP client library available from _crates.io_ that does a
much better job with HTTP than our chapter's `cheapo_request` function.
- The `spawn-blocking` directory includes the definition of `spawn_blocking`
presented in the section "Primitive Futures and Executors: When Is A Future
Worth Polling Again?". The crate also includes some tests to exercise the
function.
- The `block-on` directory includes the implementation of a simple `block_on`
executor, which demonstrates polling and waiting for wakers to be invoked.
- The chat client and server used as an extended example are in their own
repository, at `https://github.com/ProgrammingRust/async-chat`.
## Chapter 21: Macros
7 years ago
- The `json-macro` directory holds the definition of the `json!` macro built in
the section “The json! Macro”.
## Chapter 22: Unsafe Code
7 years ago
- The `ascii` directory holds the `Ascii` type used as an example in the
sections “Unsafe Blocks” and “Unsafe Functions”.
- The `ref-with-flag` directory holds the `RefWithFlag` type from the “Raw
Pointers” section.
- The `gap-buffer` directory holds the `GapBuffer` type, used in the “Raw
Pointers” section to illustrate pointer arithmetic and `std::ptr::read` and
`std::ptr::write`.
## Chapter 22: Foreign Functions
7 years ago
- The `libgit2-rs` and `libgit2-rs-safe` directories contain the two versions of
the program that uses Rust's foreign function interface to call functions from
the `libgit2` C library. The version in `libgit2-rs` is written as a single
giant block of unsafe code, whereas the version in `libgit2-rs-safe`
implements a safe Rust interface to the same functionality, using Rust's type
system to enforce libgit2's rules for proper use of the library.
Note that both of these require you to have a copy of `libgit2` present on
your system. The chapter provides detailed instructions for building the
correct version, for Linux, macOS, and Microsoft Windows.