bitflags::bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Capability: u64 {
const IPV6 = 1 << 0;
const VRF = 1 << 1;
const NAMESPACES = 1 << 2;
const ROUTE_MONITORING = 1 << 3;
const DNS_MUTATION = 1 << 4;
const INTERFACE_ADMIN_STATE = 1 << 5;
const INTERFACE_MTU = 1 << 6;
const INTERFACE_MONITORING = 1 << 7;
const NEIGHBOR_MONITORING = 1 << 8;
const ADDRESS_MONITORING = 1 << 9;
const MONITORING = Self::ROUTE_MONITORING.bits()
| Self::INTERFACE_MONITORING.bits()
| Self::NEIGHBOR_MONITORING.bits()
| Self::ADDRESS_MONITORING.bits();
}
}
pub trait CapabilityProvider {
fn capabilities(&self) -> Capability;
}
#[cfg(test)]
mod tests {
use super::Capability;
#[test]
fn interface_configuration_capabilities_are_distinct_feature_gates() {
assert_ne!(
Capability::INTERFACE_ADMIN_STATE.bits(),
Capability::INTERFACE_MTU.bits()
);
assert!(!Capability::INTERFACE_ADMIN_STATE.contains(Capability::INTERFACE_MTU));
}
#[test]
fn monitoring_aggregate_requires_every_event_domain() {
let partial = Capability::ROUTE_MONITORING
| Capability::INTERFACE_MONITORING
| Capability::ADDRESS_MONITORING;
assert!(!partial.contains(Capability::MONITORING));
assert!((partial | Capability::NEIGHBOR_MONITORING).contains(Capability::MONITORING));
}
}