codesniff 0.1.2

Simple CLI tool to explore codebases looking for code smells.
use ratatui::widgets::ListState;

pub struct StatefulList<T> {
    pub state: ListState,
    pub items: Vec<T>,
}

impl<T> StatefulList<T> {
    pub fn with_items(items: Vec<T>) -> StatefulList<T> {
        StatefulList {
            state: ListState::default(),
            items,
        }
    }

    pub fn next_nth(&mut self, n: usize) {
        let i = match self.state.selected() {
            Some(i) => {
                if i >= self.items.len() - n {
                    0
                } else {
                    i + n
                }
            }
            None => n,
        };
        self.state.select(Some(i));
    }

    pub fn previous_nth(&mut self, n: usize) {
        let i = match self.state.selected() {
            Some(i) => {
                if i <= n - 1 {
                    self.items.len() - 1
                } else {
                    i - n
                }
            }
            None => 0,
        };
        self.state.select(Some(i));
    }

    pub fn next(&mut self) {
        self.next_nth(1)
    }

    pub fn previous(&mut self) {
        self.previous_nth(1)
    }

    pub fn unselect(&mut self) {
        self.state.select(None);
    }
}