automerge/rust/automerge/examples/quickstart.rs
Alex Good dd3c6d1303
Move rust workspace into ./rust
After some discussion with PVH I realise that the repo structure in the
last reorg was very rust-centric. In an attempt to put each language on
a level footing move the rust code and project files into ./rust
2022-10-16 19:55:51 +01:00

57 lines
1.8 KiB
Rust

use automerge::transaction::CommitOptions;
use automerge::transaction::Transactable;
use automerge::AutomergeError;
use automerge::ObjType;
use automerge::{Automerge, ROOT};
// Based on https://automerge.github.io/docs/quickstart
fn main() {
let mut doc1 = Automerge::new();
let (cards, card1) = doc1
.transact_with::<_, _, AutomergeError, _>(
|_| CommitOptions::default().with_message("Add card".to_owned()),
|tx| {
let cards = tx.put_object(ROOT, "cards", ObjType::List).unwrap();
let card1 = tx.insert_object(&cards, 0, ObjType::Map)?;
tx.put(&card1, "title", "Rewrite everything in Clojure")?;
tx.put(&card1, "done", false)?;
let card2 = tx.insert_object(&cards, 0, ObjType::Map)?;
tx.put(&card2, "title", "Rewrite everything in Haskell")?;
tx.put(&card2, "done", false)?;
Ok((cards, card1))
},
)
.unwrap()
.result;
let mut doc2 = Automerge::new();
doc2.merge(&mut doc1).unwrap();
let binary = doc1.save();
let mut doc2 = Automerge::load(&binary).unwrap();
doc1.transact_with::<_, _, AutomergeError, _>(
|_| CommitOptions::default().with_message("Mark card as done".to_owned()),
|tx| {
tx.put(&card1, "done", true)?;
Ok(())
},
)
.unwrap();
doc2.transact_with::<_, _, AutomergeError, _>(
|_| CommitOptions::default().with_message("Delete card".to_owned()),
|tx| {
tx.delete(&cards, 0)?;
Ok(())
},
)
.unwrap();
doc1.merge(&mut doc2).unwrap();
for change in doc1.get_changes(&[]).unwrap() {
let length = doc1.length_at(&cards, &[change.hash()]);
println!("{} {}", change.message().unwrap(), length);
}
}