use crate::transport::TransportKind;
pub struct FallbackController {
priority: Vec<TransportKind>,
current: Option<TransportKind>,
}
impl FallbackController {
pub fn new(priority: Vec<TransportKind>) -> Self {
let current = priority.first().copied();
Self { priority, current }
}
pub fn fallback(&mut self) -> Option<TransportKind> {
let current_idx = self
.current
.and_then(|c| self.priority.iter().position(|&p| p == c))?;
let next = self.priority.get(current_idx + 1).copied();
self.current = next;
next
}
pub fn current(&self) -> Option<TransportKind> {
self.current
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn steps_through_priority() {
let mut f = FallbackController::new(vec![TransportKind::Tcp, TransportKind::Udp]);
assert_eq!(f.current(), Some(TransportKind::Tcp));
assert_eq!(f.fallback(), Some(TransportKind::Udp));
assert_eq!(f.current(), Some(TransportKind::Udp));
assert!(f.fallback().is_none());
assert!(f.current().is_none());
}
}