diff options
author | Nora <nora.widdecke@tu-bs.de> | 2019-02-02 13:22:12 +0100 |
---|---|---|
committer | Nora <nora.widdecke@tu-bs.de> | 2019-02-02 13:26:06 +0100 |
commit | cfee2f44a247acbf03514f04cdb80278da04dd35 (patch) | |
tree | b100616de7b31db1b8531da6976061fb858a898f | |
parent | 6d164685285b12a03739e441d0150cf37ec9503b (diff) |
ad khcursor prev
-rw-r--r-- | src/actions/cursor.rs | 20 | ||||
-rw-r--r-- | src/seqfile.rs | 18 | ||||
-rw-r--r-- | src/utils/fileutil.rs | 7 |
3 files changed, 44 insertions, 1 deletions
diff --git a/src/actions/cursor.rs b/src/actions/cursor.rs index 4fc6a92..40f895a 100644 --- a/src/actions/cursor.rs +++ b/src/actions/cursor.rs @@ -3,12 +3,17 @@ extern crate atty; use cursorfile; use utils::stdioutils; use KhResult; +use khline::KhLine; +use seqfile; -pub fn do_cursor(_args: &[&str]) -> KhResult<()> { +pub fn do_cursor(args: &[&str]) -> KhResult<()> { if !stdioutils::is_stdin_tty() { write_stdin_to_cursorfile()?; } else { //println!("stdin is tty") + if args.len() > 0 && args[0] == "prev" { + return cursor_sequence_prev(); + } } if !stdioutils::is_stdout_tty() || stdioutils::is_stdin_tty() { @@ -36,6 +41,19 @@ fn write_cursorfile_to_stdout() { } } +fn cursor_sequence_prev() -> KhResult<()> { + let cursor_event = cursorfile::read_cursorfile()?.to_event().unwrap(); + let mut seq = seqfile::read_seqfile_backwards()? + .map(|line| line.parse::<KhLine>().unwrap()); + seq.find(|line| line.matches(&cursor_event)); + if let Some(next_elem) = seq.next() { + cursorfile::write_cursorfile(&next_elem.to_string())?; + } else { + warn!("Already at end of sequence"); + } + Ok(()) +} + #[cfg(test)] mod integration { use super::*; diff --git a/src/seqfile.rs b/src/seqfile.rs index 66caed3..9a368f1 100644 --- a/src/seqfile.rs +++ b/src/seqfile.rs @@ -21,6 +21,12 @@ pub fn read_seqfile() -> io::Result<impl Iterator<Item = String>> { fileutil::read_lines_from_file(&seqfile) } +pub fn read_seqfile_backwards() -> io::Result<impl Iterator<Item = String>> { + let seqfile = get_seqfile(); + debug!("Reading sequence file: {}", seqfile.to_string_lossy()); + fileutil::read_lines_from_file_backwards(&seqfile) +} + #[cfg(test)] mod tests { use super::*; @@ -41,6 +47,18 @@ mod tests { } #[test] + fn read_seqfile_backwards_test() { + let testdir = prepare_testdir("testdir_with_seq"); + let mut seqfile_read: Vec<String> = read_seqfile_backwards().unwrap().collect(); + seqfile_read.reverse(); + let mut seqfile_string = seqfile_read.join("\n"); + seqfile_string.push('\n'); + + let predicate = predicate::str::similar(seqfile_string); + testdir.child(".khaleesi/seq").assert(predicate); + } + + #[test] fn write_to_seqfile_test() { let testdir = prepare_testdir("testdir"); let teststr = "Teststr äöüß\n"; diff --git a/src/utils/fileutil.rs b/src/utils/fileutil.rs index ab90a55..3c577e7 100644 --- a/src/utils/fileutil.rs +++ b/src/utils/fileutil.rs @@ -53,6 +53,13 @@ pub fn read_lines_from_file(filepath: &Path) -> io::Result<impl Iterator<Item = lines.map(|result| result.into_iter()) } +pub fn read_lines_from_file_backwards(filepath: &Path) -> io::Result<impl Iterator<Item = String>> { + let f = fs::File::open(filepath)?; + let f = BufReader::new(f); + let lines: Result<Vec<String>, io::Error> = f.lines().collect(); + lines.map(|result| result.into_iter().rev()) +} + pub fn read_file_to_string(path: &Path) -> io::Result<String> { let mut file = fs::File::open(&path)?; let mut contents = String::new(); |