diff options
| author | Rose Hogenson <rosehogenson@posteo.net> | 2023-12-29 16:28:46 -0800 |
|---|---|---|
| committer | Rose Hogenson <rosehogenson@posteo.net> | 2023-12-29 16:28:46 -0800 |
| commit | aee3a1f70072b5a35f4bf2a938b3722295d7efa9 (patch) | |
| tree | 2af9b972768396d9eb717763bff0b57d3ea0b42b /src/rope.rs | |
| parent | da54c7c2c103c9b1c98f0c5179945b0122a1eef7 (diff) | |
| download | editor-aee3a1f70072b5a35f4bf2a938b3722295d7efa9.tar.zst | |
Allow saving the file with CTRL-S.
Diffstat (limited to 'src/rope.rs')
| -rw-r--r-- | src/rope.rs | 20 |
1 files changed, 19 insertions, 1 deletions
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(); |
