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
use std::fmt;

#[derive(Default)]
pub struct Exit {
    exited: bool,
    exits: Vec<Box<dyn FnOnce() + Send + Sync>>,
}

impl Exit {
    pub fn register_exit(&mut self, exit: Box<dyn FnOnce() + Send + Sync>) {
        if self.exited {
            exit();
        } else {
            self.exits.push(exit);
        }
    }

    pub fn exit(&mut self) {
        self.exited = true;
        for exit in self.exits.drain(..) {
            exit();
        }
    }
}

impl fmt::Debug for Exit {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        write!(f, "{} exits", self.exits.len())
    }
}