summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNora <nora.widdecke@tu-bs.de>2019-02-02 13:22:12 +0100
committerNora <nora.widdecke@tu-bs.de>2019-02-02 13:26:06 +0100
commitcfee2f44a247acbf03514f04cdb80278da04dd35 (patch)
treeb100616de7b31db1b8531da6976061fb858a898f
parent6d164685285b12a03739e441d0150cf37ec9503b (diff)
ad khcursor prev
-rw-r--r--src/actions/cursor.rs20
-rw-r--r--src/seqfile.rs18
-rw-r--r--src/utils/fileutil.rs7
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();