copperline 0.3.0

Pure-Rust Command Line Editing Library
Documentation
use std::collections::VecDeque;
use std::ops::Index;

pub struct Cursor<'a> {
    history: &'a History,
    cur: Option<usize>
}

impl<'a> Cursor<'a> {

    pub fn new(h: &'a History) -> Cursor<'a> {
        Cursor { history: h, cur: None }
    }

    pub fn incr(&mut self) -> bool {
        let mut flag = false;
        self.cur = match self.cur {
            Some(i) if i + 1 < self.history.len() => Some(i + 1),
            Some(i) => Some(i),
            None if self.history.len() > 0 => {flag = true; Some(0)},
            None => None
        };
        flag
    }

    pub fn decr(&mut self) -> bool {
        let mut flag = false;
        self.cur = match self.cur {
            Some(i) if i > 0 => Some(i - 1),
            Some(_) => {flag = true; None},
            None => None
        };
        flag
    }

    pub fn get(&self) -> Option<&'a String> {
        match self.cur {
            None => None,
            Some(i) => self.history.get(i)
        }
    }

}

pub struct History {
    deque: VecDeque<String>
}

impl History {

    pub fn new() -> History {
        History {
            deque: VecDeque::new()
        }
    }

    pub fn len(&self) -> usize {
        self.deque.len()
    }

    pub fn push(&mut self, s: String) {
        if !s.is_empty() && self.deque.front() != Option::Some(&s) {
            self.deque.push_front(s)
        }
    }

    pub fn pop(&mut self) -> Option<String> {
        self.deque.pop_front()
    }

    pub fn get(&self, idx: usize) -> Option<&String> {
        let len = self.len();
        if len > 0 && idx < len {
            Some(self.deque.index(idx))
        } else {
            None
        }
    }

    pub fn remove(&mut self, idx: usize) -> Option<String> {
        self.deque.remove(idx)
    }

    pub fn clear(&mut self) {
        self.deque.clear()
    }

}