wtx/http/server_framework/
endpoint.rs1use crate::{
2 http::{
3 AutoStream, ManualStream, OperationMode, StatusCode,
4 server_framework::{ResFinalizer, RouteMatch, ServerFrameworkError},
5 },
6 misc::{FnFut, FnFutWrapper},
7};
8
9pub trait Endpoint<CA, E, S, SA>
11where
12 E: From<crate::Error>,
13{
14 const OM: OperationMode = OperationMode::Auto;
16
17 fn auto(
19 &self,
20 _: &mut AutoStream<CA, SA>,
21 _: (u8, &[RouteMatch]),
22 ) -> impl Future<Output = Result<StatusCode, E>> {
23 async { Err(crate::Error::from(ServerFrameworkError::OperationModeMismatch).into()) }
24 }
25
26 fn manual(
28 &self,
29 _: ManualStream<CA, S, SA>,
30 _: (u8, &[RouteMatch]),
31 ) -> impl Future<Output = Result<(), E>> {
32 async { Err(crate::Error::from(ServerFrameworkError::OperationModeMismatch).into()) }
33 }
34}
35
36impl<CA, E, S, SA, T> Endpoint<CA, E, S, SA> for &T
37where
38 E: From<crate::Error>,
39 T: Endpoint<CA, E, S, SA>,
40{
41 const OM: OperationMode = T::OM;
42
43 #[inline]
44 async fn auto(
45 &self,
46 auto_stream: &mut AutoStream<CA, SA>,
47 path_defs: (u8, &[RouteMatch]),
48 ) -> Result<StatusCode, E> {
49 (*self).auto(auto_stream, path_defs).await
50 }
51
52 #[inline]
53 async fn manual(
54 &self,
55 manual_stream: ManualStream<CA, S, SA>,
56 path_defs: (u8, &[RouteMatch]),
57 ) -> Result<(), E> {
58 (*self).manual(manual_stream, path_defs).await
59 }
60}
61
62impl<CA, E, F, S, SA, RES> Endpoint<CA, E, S, SA> for FnFutWrapper<(), F>
63where
64 E: From<crate::Error>,
65 F: FnFut<(), Result = RES>,
66 RES: ResFinalizer<E>,
67{
68 #[inline]
69 async fn auto(
70 &self,
71 auto_stream: &mut AutoStream<CA, SA>,
72 _: (u8, &[RouteMatch]),
73 ) -> Result<StatusCode, E> {
74 auto_stream.req.clear();
75 self.0.call(()).await.finalize_response(&mut auto_stream.req)
76 }
77}
78
79impl<CA, E, F, S, SA> Endpoint<CA, E, S, SA> for FnFutWrapper<(ManualStream<CA, S, SA>,), F>
80where
81 E: From<crate::Error>,
82 F: FnFut<(ManualStream<CA, S, SA>,), Result = Result<(), E>>,
83{
84 const OM: OperationMode = OperationMode::Manual;
85
86 #[inline]
87 async fn manual(
88 &self,
89 manual_stream: ManualStream<CA, S, SA>,
90 _: (u8, &[RouteMatch]),
91 ) -> Result<(), E> {
92 self.0.call((manual_stream,)).await?;
93 Ok(())
94 }
95}