aboutsummaryrefslogtreecommitdiffstats
path: root/src/rope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rope.rs')
-rw-r--r--src/rope.rs20
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();