aws_smithy_http_server/plugin/
layer.rs1use std::marker::PhantomData;
7
8use tower::Layer;
9
10use super::{HttpMarker, ModelMarker, Plugin};
11
12pub struct LayerPlugin<L>(pub L);
14
15impl<Ser, Op, S, L> Plugin<Ser, Op, S> for LayerPlugin<L>
16where
17 L: Layer<S>,
18{
19 type Output = L::Service;
20
21 fn apply(&self, svc: S) -> Self::Output {
22 self.0.layer(svc)
23 }
24}
25
26impl<L> HttpMarker for LayerPlugin<L> {}
30impl<L> ModelMarker for LayerPlugin<L> {}
31
32pub struct PluginLayer<Ser, Op, Pl> {
34 plugin: Pl,
35 _ser: PhantomData<Ser>,
36 _op: PhantomData<Op>,
37}
38
39impl<S, Ser, Op, Pl> Layer<S> for PluginLayer<Ser, Op, Pl>
40where
41 Pl: Plugin<Ser, Op, S>,
42{
43 type Service = Pl::Output;
44
45 fn layer(&self, inner: S) -> Self::Service {
46 self.plugin.apply(inner)
47 }
48}
49
50impl<Pl> PluginLayer<(), (), Pl> {
51 pub fn new<Ser, Op>(plugin: Pl) -> PluginLayer<Ser, Op, Pl> {
52 PluginLayer {
53 plugin,
54 _ser: PhantomData,
55 _op: PhantomData,
56 }
57 }
58}