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.

version
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)
    }
}
  1. 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}");
  2. 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
  1. 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}");
  2. 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
  1. 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}");
  2. 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.