use std::path::PathBuf;
pub const K_SUBJECT: &str = "dev.actcore.referrer.subject";
pub const K_KIND: &str = "dev.actcore.referrer.kind";
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ReferrerInfo {
pub digest: String,
pub artifact_type: Option<String>,
pub kind: String,
pub manifest_path: PathBuf,
}
pub fn referrer_kind(artifact_type: Option<&str>) -> &'static str {
match artifact_type {
Some(t) if t.contains("sigstore.bundle") => "sigstore-bundle",
Some(t) if t.contains("cosign") => "cosign-signature",
Some(t) if t.contains("spdx") || t.contains("cyclonedx") || t.contains("sbom") => "sbom",
Some(t) if t.contains("in-toto") || t.contains("slsa") || t.contains("provenance") => {
"slsa-provenance"
}
_ => "other",
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn classifies_known_artifact_types() {
assert_eq!(
referrer_kind(Some("application/vnd.dev.sigstore.bundle.v0.3+json")),
"sigstore-bundle"
);
assert_eq!(
referrer_kind(Some("application/vnd.dev.cosign.simplesigning.v1+json")),
"cosign-signature"
);
assert_eq!(referrer_kind(Some("application/spdx+json")), "sbom");
assert_eq!(
referrer_kind(Some("application/vnd.cyclonedx+json")),
"sbom"
);
assert_eq!(
referrer_kind(Some("application/vnd.in-toto+json")),
"slsa-provenance"
);
assert_eq!(referrer_kind(Some("application/octet-stream")), "other");
assert_eq!(referrer_kind(None), "other");
}
}