spacegate_kernel/helper_layers/
injector.rs1use hyper::service::Service;
2use tower_layer::Layer;
3
4use crate::{injector::Inject, SgRequest};
5#[derive(Debug, Clone)]
6pub struct InjectorLayer<I> {
7 inject: I,
8}
9
10#[derive(Debug, Clone)]
11pub struct Injector<I, S> {
12 inject: I,
13 inner: S,
14}
15
16impl<I> InjectorLayer<I> {
17 pub fn new(inject: I) -> Self {
18 Self { inject }
19 }
20}
21
22impl<I, S> Injector<I, S> {
23 pub fn new(inject: I, inner: S) -> Self {
24 Self { inject, inner }
25 }
26}
27
28impl<S, I> Layer<S> for InjectorLayer<I>
29where
30 I: Clone,
31{
32 type Service = Injector<I, S>;
33
34 fn layer(&self, inner: S) -> Self::Service {
35 Injector::new(self.inject.clone(), inner)
36 }
37}
38
39impl<I, S> Service<SgRequest> for Injector<I, S>
40where
41 I: Inject,
42 S: Service<SgRequest>,
43{
44 type Response = S::Response;
45 type Error = S::Error;
46 type Future = S::Future;
47
48 fn call(&self, mut req: SgRequest) -> Self::Future {
49 if let Err(e) = self.inject.inject(&mut req) {
50 tracing::error!("inject error: {}", e);
51 }
52 self.inner.call(req)
53 }
54}