Practical Crates
Crate Metadata
Name and Version
A published crate is identified by metadata such as its package name and semantic version.
Program
Play the program to choose the package version and see the label assembled from metadata.
crate_metadata.rs
Replay: real traced execution (multi-file project)
fn main() {
let version = "0.2.0";
let package = Package { name: "trace-book", version };
let label = package.label();
println!("{label}");
}
struct Package<'a> {
name: &'a str,
version: &'a str,
}
impl<'a> Package<'a> {
fn label(&self) -> String {
format!("{}@{}", self.name, self.version)
}
}
fn main() {
let version = "0.3.0";
let package = Package { name: "trace-book", version };
let label = package.label();
println!("{label}");
}
struct Package<'a> {
name: &'a str,
version: &'a str,
}
impl<'a> Package<'a> {
fn label(&self) -> String {
format!("{}@{}", self.name, self.version)
}
}
fn main() {
let version = "1.0.0";
let package = Package { name: "trace-book", version };
let label = package.label();
println!("{label}");
}
struct Package<'a> {
name: &'a str,
version: &'a str,
}
impl<'a> Package<'a> {
fn label(&self) -> String {
format!("{}@{}", self.name, self.version)
}
}
version ← "0.2.0", package ← (empty)
1fn main() {2 let versio→ "0.2.0"n = "0.2.0"; //@version="0.2.0", "0.3.0", "1.0.0"3 let packag→ (empty)e = Package { name: "trace-book", versio"0.2.0"n };4 let label = package.label();5 println!("{label}");label ← "trace-book@0.2.0"
3 let package = Package { name: "trace-book", version };4 let labe→ "trace-book@0.2.0"l = package.label();5 println!("{label}");6}outputtrace-book@0.2.0
version ← "0.3.0", package ← (empty)
1fn main() {2 let versio→ "0.3.0"n = "0.3.0";3 let packag→ (empty)e = Package { name: "trace-book", versio"0.3.0"n };4 let label = package.label();5 println!("{label}");label ← "trace-book@0.3.0"
3 let package = Package { name: "trace-book", version };4 let labe→ "trace-book@0.3.0"l = package.label();5 println!("{label}");6}outputtrace-book@0.3.0
version ← "1.0.0", package ← (empty)
1fn main() {2 let versio→ "1.0.0"n = "1.0.0";3 let packag→ (empty)e = Package { name: "trace-book", versio"1.0.0"n };4 let label = package.label();5 println!("{label}");label ← "trace-book@1.0.0"
3 let package = Package { name: "trace-book", version };4 let labe→ "trace-book@1.0.0"l = package.label();5 println!("{label}");6}outputtrace-book@1.0.0
metadata
Crate metadata gives tools a stable package name and version to display or resolve.
semantic version
Changing `version` models the version string a crate would publish.
method
`label` keeps formatting behavior beside the package data it uses.