spacegate_kernel/extension/
defer.rs

1use std::{
2    fmt::Debug,
3    sync::{Arc, Mutex},
4};
5
6use crate::SgRequest;
7
8/// It's a hole, don't abuse it pls.
9#[derive(Clone, Default)]
10pub struct Defer {
11    mappers: Arc<Mutex<Vec<Box<dyn FnOnce(SgRequest) -> SgRequest + Send>>>>,
12}
13
14impl Debug for Defer {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        f.debug_struct("Defer").finish()
17    }
18}
19
20impl Defer {
21    pub fn push_back(&self, f: impl FnOnce(SgRequest) -> SgRequest + Send + 'static) {
22        let mut g = self.mappers.lock().expect("never poisoned");
23        g.push(Box::new(f))
24    }
25    pub fn apply(&self, req: SgRequest) -> SgRequest {
26        let mut g = self.mappers.lock().expect("never poisoned");
27        let mut req = req;
28        for f in g.drain(..) {
29            req = (f)(req)
30        }
31        req
32    }
33}