rama_http_backend/server/layer/upgrade/
layer.rs1use super::{service::UpgradeHandler, UpgradeService, Upgraded};
2use rama_core::{matcher::Matcher, Context, Layer, Service};
3use rama_http_types::Request;
4use std::{convert::Infallible, fmt, sync::Arc};
5
6pub struct UpgradeLayer<S, O> {
12 handlers: Vec<Arc<UpgradeHandler<S, O>>>,
13}
14
15impl<S, O> UpgradeLayer<S, O> {
16 pub fn new<M, R, H>(matcher: M, responder: R, handler: H) -> Self
18 where
19 M: Matcher<S, Request>,
20 R: Service<S, Request, Response = (O, Context<S>, Request), Error = O> + Clone,
21 H: Service<S, Upgraded, Response = (), Error = Infallible> + Clone,
22 {
23 Self {
24 handlers: vec![Arc::new(UpgradeHandler::new(matcher, responder, handler))],
25 }
26 }
27
28 pub fn on<M, R, H>(mut self, matcher: M, responder: R, handler: H) -> Self
30 where
31 M: Matcher<S, Request>,
32 R: Service<S, Request, Response = (O, Context<S>, Request), Error = O> + Clone,
33 H: Service<S, Upgraded, Response = (), Error = Infallible> + Clone,
34 {
35 self.handlers
36 .push(Arc::new(UpgradeHandler::new(matcher, responder, handler)));
37 self
38 }
39}
40
41impl<S, O> fmt::Debug for UpgradeLayer<S, O> {
42 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
43 f.debug_struct("UpgradeLayer")
44 .field("handlers", &self.handlers)
45 .finish()
46 }
47}
48
49impl<S, O> Clone for UpgradeLayer<S, O> {
50 fn clone(&self) -> Self {
51 Self {
52 handlers: self.handlers.clone(),
53 }
54 }
55}
56
57impl<S, State, O> Layer<S> for UpgradeLayer<State, O> {
58 type Service = UpgradeService<S, State, O>;
59
60 fn layer(&self, inner: S) -> Self::Service {
61 UpgradeService::new(self.handlers.clone(), inner)
62 }
63}