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}