use {crate::SessionExtension, reovim_driver_search::Direction};
#[derive(Debug, Default)]
pub struct SearchState {
pub last_pattern: Option<String>,
pub last_direction: Direction,
pub pending_search: Option<Direction>,
}
impl SessionExtension for SearchState {
fn create() -> Self {
Self::default()
}
}
impl SearchState {
pub fn set(&mut self, pattern: String, direction: Direction) {
self.last_pattern = Some(pattern);
self.last_direction = direction;
}
#[must_use]
pub fn pattern_for_repeat(&self) -> Option<&str> {
self.last_pattern.as_deref()
}
#[must_use]
pub const fn direction_for_repeat(&self) -> Direction {
self.last_direction
}
#[must_use]
pub const fn direction_for_opposite(&self) -> Direction {
match self.last_direction {
Direction::Forward => Direction::Backward,
Direction::Backward => Direction::Forward,
}
}
pub const fn start_pending_search(&mut self, direction: Direction) {
self.pending_search = Some(direction);
}
pub const fn take_pending_search(&mut self) -> Option<Direction> {
let result = self.pending_search;
self.pending_search = None;
result
}
#[must_use]
pub const fn has_pending_search(&self) -> bool {
self.pending_search.is_some()
}
pub const fn clear_pending_search(&mut self) {
self.pending_search = None;
}
}
#[cfg(test)]
#[path = "tests/search.rs"]
mod tests;