use crate::types::{Link, Tier};
pub fn stamp(link: &mut Link, tier: Tier) -> Result<(), String> {
if !tier.is_valid() {
return Err(format!("invalid provenance tier: {tier:?}"));
}
link.provenance = Some(tier);
Ok(())
}
pub fn must_stamp(link: &mut Link, tier: Tier) {
stamp(link, tier).expect("must_stamp: invalid tier");
}
#[must_use]
pub fn get(link: &Link) -> Option<&Tier> {
link.provenance.as_ref()
}
#[must_use]
pub fn is_author_tier(link: &Link) -> bool {
matches!(link.provenance, Some(Tier::Author))
}
#[must_use]
pub fn is_storage_tier(link: &Link) -> bool {
matches!(
link.provenance,
Some(Tier::StorageLocal) | Some(Tier::StorageRemote)
)
}
#[must_use]
pub fn is_protocol_tier(link: &Link) -> bool {
matches!(link.provenance, Some(Tier::Protocol(_)))
}
pub fn clone_to(src: &Link, dest: &mut Link) {
if let Some(tier) = src.provenance.clone() {
dest.provenance = Some(tier);
}
}