Skip to main content

wtx/http/server_framework/
endpoint.rs

1use crate::{
2  http::{
3    AutoStream, ManualStream, OperationMode, StatusCode,
4    server_framework::{ResFinalizer, RouteMatch, ServerFrameworkError},
5  },
6  misc::{FnFut, FnFutWrapper},
7};
8
9/// Endpoint that generates a response.
10pub trait Endpoint<CA, E, S, SA>
11where
12  E: From<crate::Error>,
13{
14  /// Operation mode
15  const OM: OperationMode = OperationMode::Auto;
16
17  /// Calls endpoint logic of automatic streams
18  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  /// Calls endpoint logic of manual streams
27  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}