spacegate_kernel/extension/
defer.rs1use std::{
2 fmt::Debug,
3 sync::{Arc, Mutex},
4};
5
6use crate::SgRequest;
7
8#[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}