From 2d50906f4323ddc4cfcbeba98be2599ac1e2ec34 Mon Sep 17 00:00:00 2001 From: Nathan Vegdahl Date: Sat, 7 Feb 2015 23:35:25 -0800 Subject: [PATCH] Moved the rest of file loading/saving into Buffer. --- src/buffer/mod.rs | 16 +++++++-- src/editor/mod.rs | 3 +- src/files.rs | 19 ---------- src/formatter.rs | 90 ----------------------------------------------- src/main.rs | 1 - todo.md | 2 -- 6 files changed, 15 insertions(+), 116 deletions(-) delete mode 100644 src/files.rs diff --git a/src/buffer/mod.rs b/src/buffer/mod.rs index 051ff78..817c094 100644 --- a/src/buffer/mod.rs +++ b/src/buffer/mod.rs @@ -3,9 +3,9 @@ use std::mem; use std::old_path::Path; use std::old_io::fs::File; -use std::old_io::{IoResult, BufferedReader}; +use std::old_io::{IoResult, BufferedReader, BufferedWriter}; -use self::line::Line; +use self::line::{Line, line_ending_to_str}; use self::node::{BufferNode, BufferNodeGraphemeIter, BufferNodeLineIter}; use self::undo_stack::{UndoStack}; use self::undo_stack::Operation::*; @@ -84,6 +84,18 @@ impl Buffer { return Ok(buf); } + + + pub fn save_to_file(&self, path: &Path) -> IoResult<()> { + let mut f = BufferedWriter::new(try!(File::create(path))); + + for l in self.line_iter() { + let _ = f.write_str(l.as_str()); + let _ = f.write_str(line_ending_to_str(l.ending)); + } + + return Ok(()); + } diff --git a/src/editor/mod.rs b/src/editor/mod.rs index 930c5de..5592906 100644 --- a/src/editor/mod.rs +++ b/src/editor/mod.rs @@ -6,7 +6,6 @@ use formatter::LineFormatter; use formatter::RoundingBehavior::*; use std::old_path::Path; use std::cmp::{min, max}; -use files::{save_buffer_to_file}; use string_utils::grapheme_count; use self::cursor::CursorSet; @@ -85,7 +84,7 @@ impl Editor { pub fn save_if_dirty(&mut self) { if self.dirty && self.file_path != Path::new("") { - let _ = save_buffer_to_file(&self.buffer, &self.file_path); + let _ = self.buffer.save_to_file(&self.file_path); self.dirty = false; } } diff --git a/src/files.rs b/src/files.rs deleted file mode 100644 index 7f95322..0000000 --- a/src/files.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::old_io::{IoResult, BufferedWriter}; -use std::old_io::fs::File; -use std::old_path::Path; - -use buffer::line::{line_ending_to_str}; -use buffer::Buffer as TextBuffer; - - -pub fn save_buffer_to_file(tb: &TextBuffer, path: &Path) -> IoResult<()> { - // TODO: make save atomic - let mut f = BufferedWriter::new(try!(File::create(path))); - - for l in tb.line_iter() { - let _ = f.write_str(l.as_str()); - let _ = f.write_str(line_ending_to_str(l.ending)); - } - - return Ok(()); -} diff --git a/src/formatter.rs b/src/formatter.rs index 1b4e637..4de889c 100644 --- a/src/formatter.rs +++ b/src/formatter.rs @@ -107,93 +107,3 @@ pub trait LineFormatter { } } - - - - -//==================================================================== -// UNIT TESTS -//==================================================================== - -//#[cfg(test)] -//mod tests { -// #![allow(unused_imports)] -// use buffer::line::{Line, LineGraphemeIter}; -// use super::LineFormatter; -// -// pub struct TestLineFormatIter<'a> { -// grapheme_iter: LineGraphemeIter<'a>, -// f: &'a TestLineFormatter, -// pos: (usize, usize), -// } -// -// impl<'a> Iterator for TestLineFormatIter<'a> { -// type Item = (&'a str, (usize, usize), usize); -// -// fn next(&mut self) -> Option<(&'a str, (usize, usize), usize)> { -// if let Some(g) = self.grapheme_iter.next() { -// let pos = self.pos; -// self.pos = (pos.0, pos.1 + 1); -// return Some((g, pos, 1)); -// } -// else { -// return None; -// } -// } -// } -// -// pub struct TestLineFormatter { -// tab_width: u8 -// } -// -// impl TestLineFormatter { -// pub fn new() -> TestLineFormatter { -// TestLineFormatter { -// tab_width: 4, -// } -// } -// } -// -// impl<'a> LineFormatter<'a, TestLineFormatIter<'a>> for TestLineFormatter { -// fn single_line_height(&self) -> usize { -// 1 -// } -// -// fn iter(&'a self, line: &'a Line) -> TestLineFormatIter<'a> { -// TestLineFormatIter { -// grapheme_iter: line.grapheme_iter(), -// f: self, -// pos: (0, 0), -// } -// } -// } -// -// -// #[test] -// fn simple_iterator() { -// let line = Line::new_from_str("Hello!"); -// let mut f = TestLineFormatter::new(); -// let mut iter = f.iter(&line); -// -// let (a,_,_) = iter.next().unwrap(); -// assert_eq!(a, "H"); -// -// let (a,_,_) = iter.next().unwrap(); -// assert_eq!(a, "e"); -// -// let (a,_,_) = iter.next().unwrap(); -// assert_eq!(a, "l"); -// -// let (a,_,_) = iter.next().unwrap(); -// assert_eq!(a, "l"); -// -// let (a,_,_) = iter.next().unwrap(); -// assert_eq!(a, "o"); -// -// let (a,_,_) = iter.next().unwrap(); -// assert_eq!(a, "!"); -// -// let a = iter.next(); -// assert_eq!(a, None); -// } -//}// \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 154c0ab..aa22fda 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,6 @@ use term_ui::formatter::ConsoleLineFormatter; mod string_utils; mod buffer; mod formatter; -mod files; mod editor; mod term_ui; //mod font; diff --git a/todo.md b/todo.md index 3326a45..f451104 100644 --- a/todo.md +++ b/todo.md @@ -25,6 +25,4 @@ - File opening by entering path - UI that wraps editors, for split view. - Persistent infinite undo -- Saving/loading files to/from buffers should be the Buffer's job, since it - knows its own internals and can optimize things better. - "Projects" \ No newline at end of file