docbox_core/utils/rollback.rs
1/// "Rollback guard" pretty much a transaction, if "commit" is not called
2/// and the value is dropped (Usually by an error case) the rollback
3/// function will be run
4pub struct RollbackGuard<F: FnOnce()> {
5 rollback: Option<F>,
6}
7
8impl<F: FnOnce()> RollbackGuard<F> {
9 pub fn new(rollback: F) -> Self {
10 Self {
11 rollback: Some(rollback),
12 }
13 }
14
15 /// Explicitly cancel rollback (e.g., if all went fine).
16 pub fn commit(mut self) {
17 self.rollback = None;
18 }
19}
20
21impl<F: FnOnce()> Drop for RollbackGuard<F> {
22 fn drop(&mut self) {
23 if let Some(rollback) = self.rollback.take() {
24 rollback();
25 }
26 }
27}