use super::git_sha::GitSha;
use super::target::TargetTriple;
use super::toolchain_channel::ToolchainChannel;
use std::fmt;
const ARTEFACT_PREFIX: &str = "whitaker-lints";
const ARTEFACT_EXTENSION: &str = ".tar.zst";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ArtefactName {
git_sha: GitSha,
toolchain: ToolchainChannel,
target: TargetTriple,
}
impl ArtefactName {
#[must_use]
pub fn new(git_sha: GitSha, toolchain: ToolchainChannel, target: TargetTriple) -> Self {
Self {
git_sha,
toolchain,
target,
}
}
#[must_use]
pub fn git_sha(&self) -> &GitSha {
&self.git_sha
}
#[must_use]
pub fn toolchain(&self) -> &ToolchainChannel {
&self.toolchain
}
#[must_use]
pub fn target(&self) -> &TargetTriple {
&self.target
}
#[must_use]
pub fn filename(&self) -> String {
self.to_string()
}
}
impl fmt::Display for ArtefactName {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{ARTEFACT_PREFIX}-{}-{}-{}{}",
self.git_sha, self.toolchain, self.target, ARTEFACT_EXTENSION
)
}
}
#[cfg(test)]
mod tests {
use super::*;
use rstest::{fixture, rstest};
#[fixture]
fn sample_name() -> ArtefactName {
ArtefactName::new(
GitSha::try_from("abc1234").expect("valid sha"),
ToolchainChannel::try_from("nightly-2026-05-28").expect("valid channel"),
TargetTriple::try_from("x86_64-unknown-linux-gnu").expect("valid target"),
)
}
#[rstest]
fn display_matches_adr_format(sample_name: ArtefactName) {
assert_eq!(
sample_name.to_string(),
concat!(
"whitaker-lints-abc1234-nightly-2026-05-28",
"-x86_64-unknown-linux-gnu.tar.zst"
)
);
}
#[rstest]
fn filename_matches_display(sample_name: ArtefactName) {
assert_eq!(sample_name.filename(), sample_name.to_string());
}
#[rstest]
fn accessors_return_components(sample_name: ArtefactName) {
assert_eq!(sample_name.git_sha().as_str(), "abc1234");
assert_eq!(sample_name.toolchain().as_str(), "nightly-2026-05-28");
assert_eq!(sample_name.target().as_str(), "x86_64-unknown-linux-gnu");
}
#[rstest]
fn different_targets_produce_different_names() {
let sha = GitSha::try_from("abc1234").expect("valid");
let ch = ToolchainChannel::try_from("nightly-2026-05-28").expect("valid");
let linux = ArtefactName::new(
sha.clone(),
ch.clone(),
TargetTriple::try_from("x86_64-unknown-linux-gnu").expect("valid"),
);
let macos = ArtefactName::new(
sha,
ch,
TargetTriple::try_from("aarch64-apple-darwin").expect("valid"),
);
assert_ne!(linux.to_string(), macos.to_string());
}
}