blob: 7b75a96e4eb580627e5d18f8f62d211d45c6b8e4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//! For tests: writing to documents the way the node does, one change at a time, so
//! that tests don't depend on how the engine groups writes into changes.
use super::{Document, Transaction};
/// The writes `f` makes to `doc`, as one change; what `f` returns.
pub(crate) fn change<T>(doc: &mut Document, f: impl FnOnce(&mut Transaction<'_>) -> T) -> T {
let mut transaction = doc.transaction();
let out = f(&mut transaction);
transaction.commit();
out
}
/// The writes `f` makes to `doc`, as one change if it succeeds, dropped if not; what
/// `f` returns. Committed at time 0: the same writes make the same change.
pub(crate) fn try_change<T, E>(
doc: &mut Document,
f: impl FnOnce(&mut Transaction<'_>) -> Result<T, E>,
) -> Result<T, E> {
let mut transaction = doc.transaction();
let out = f(&mut transaction);
match &out {
Ok(_) => {
transaction.commit_with(automerge::transaction::CommitOptions::default().with_time(0));
}
Err(_) => {
transaction.rollback();
}
}
out
}
|