pub const SENSING_CAPABILITY_TAG: &str = "net.sensing@1";
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum SensingPath {
Coalesced,
DirectFallback,
Unsupported,
}
pub fn select_sensing_path(next_hop_tags: &[String], provider_tags: &[String]) -> SensingPath {
let advertises = |tags: &[String]| tags.iter().any(|tag| tag == SENSING_CAPABILITY_TAG);
if !advertises(provider_tags) {
return SensingPath::Unsupported;
}
if advertises(next_hop_tags) {
SensingPath::Coalesced
} else {
SensingPath::DirectFallback
}
}
#[cfg(test)]
mod tests {
use super::*;
fn tags(with_sensing: bool) -> Vec<String> {
let mut out = vec!["hardware.gpu".to_string()];
if with_sensing {
out.push(SENSING_CAPABILITY_TAG.to_string());
}
out
}
#[test]
fn selection_covers_all_three_arms() {
assert_eq!(
select_sensing_path(&tags(true), &tags(true)),
SensingPath::Coalesced,
);
assert_eq!(
select_sensing_path(&tags(false), &tags(true)),
SensingPath::DirectFallback,
);
assert_eq!(
select_sensing_path(&tags(true), &tags(false)),
SensingPath::Unsupported,
);
assert_eq!(
select_sensing_path(&tags(false), &tags(false)),
SensingPath::Unsupported,
);
let provider = tags(true);
assert_eq!(
select_sensing_path(&provider, &provider),
SensingPath::Coalesced,
);
}
}