use crate::core::interfaces::Ipv4Interface;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum PickerKey {
Up,
Down,
Choose,
Number(usize),
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct Picker {
pub(crate) items: Vec<Ipv4Interface>,
pub(crate) selected: usize,
}
impl Picker {
pub(crate) fn new(items: Vec<Ipv4Interface>) -> Self {
Self { items, selected: 0 }
}
pub(crate) fn key(&mut self, key: PickerKey) -> Option<Ipv4Interface> {
let last = self.items.len().checked_sub(1)?;
match key {
PickerKey::Up => self.selected = self.selected.saturating_sub(1),
PickerKey::Down => self.selected = (self.selected + 1).min(last),
PickerKey::Choose => return self.items.get(self.selected).cloned(),
PickerKey::Number(n) if (1..=self.items.len()).contains(&n) => {
self.selected = n - 1;
return self.items.get(self.selected).cloned();
}
PickerKey::Number(_) => {}
}
None
}
}