1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! # Art
//!
//! A library for modelling artistic concepts. (Actually, it's just for learning about
//! using `pub use` to re-export items in order to present a more convenient public API,
//! providing a more convenient alternative to a crate user than the internal hierarchy.)
//!
//! This is from Chapter 14 Section 2 of the Rust book.
//!
//! ## Re-exporting items
//!
//! A crate that depends on this library could write something like this:
//! ```
//! use rust_book_art::kinds::PrimaryColour;
//! use rust_book_art::utils::mix;
//!
//! fn main() {
//! let red = PrimaryColour::Red;
//! let yellow = PrimaryColour::Yellow;
//! mix(red, yellow);
//! }
//! ```
//! This would required the user of the `art` crate to figure out that colours are in the `kinds`
//! module and `mix` is in the `utils` module. That hierarchy is more useful to someone developing
//! the `art` crate than someone just using it in their own project.
//!
//! Using the re-exports, a crate user could write this instead:
//! ```
//! use rust_book_art::PrimaryColour;
//! use rust_book_art::mix;
//!
//! fn main() {
//! // --snip--
//! }
//! ```
//! Re-exporting deeply nested modules and decoupling internal structure from what the user sees
//! can improve the user's experience, and allows flexibility in the internal structure of the crate
//! code.
//!
//! ## Publishing crates
//!
//! Another reason for this crate is so I can learn about publishing to crates.io.
//!
//! First, make a [crates.io](https://crates.io) account and get an API token from crates.io/me, then run `cargo login
//! <token>`. The token is saved in *~/.cargo/credentials*.
pub use PrimaryColour;
pub use SecondaryColour;
pub use mix;