From aee3a1f70072b5a35f4bf2a938b3722295d7efa9 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Fri, 29 Dec 2023 16:28:46 -0800 Subject: Allow saving the file with CTRL-S. --- src/rope.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src/rope.rs') diff --git a/src/rope.rs b/src/rope.rs index 7d5ee28..f78dd7f 100644 --- a/src/rope.rs +++ b/src/rope.rs @@ -72,7 +72,7 @@ impl Node { // TODO: escape unprintable characters match self { Node::Leaf(v) => { - if let Err(err) = out.write(&v[start..end]) { + if let Err(err) = out.write_all(&v[start..end]) { return Err(err); } return Ok(()); @@ -235,12 +235,30 @@ impl Rope { if n == 0 { break; } + buf.truncate(n); rope = rope.concat(Rope(Rc::new(Node::Leaf(buf)))); } // TODO: rebalance return Ok(rope); } + pub fn save(&self, path: &Path) -> Result<(), std::io::Error> { + let mut f = match File::create(path) { + Ok(f) => f, + Err(err) => { + return Err(err); + } + }; + let Rope(me) = self; + if let Err(err) = me.print(&mut f, 0, me.len()) { + return Err(err); + } + if let Err(err) = f.sync_all() { + return Err(err); + } + return Ok(()); + } + pub fn len(&self) -> usize { let Rope(me) = self; return me.len(); -- cgit v1.3.1