Skip to main content

sark_core/http/response/
serve.rs

1use http::StatusCode;
2
3use super::{
4    Chunked, DEFAULT_HEADER_CAPACITY, FixedResponse, HotHeadInner, MonoResponseInner, Response,
5};
6
7#[allow(clippy::large_enum_variant)]
8#[derive(Clone, Debug)]
9pub enum Serve<'req, const N: usize = DEFAULT_HEADER_CAPACITY> {
10    Chunked(Chunked),
11    Fixed(FixedResponse<'req, N>),
12    Mono(MonoResponseInner<'req, N>),
13}
14
15impl<'req, const N: usize> Serve<'req, N> {
16    pub fn status(&self) -> StatusCode {
17        match self {
18            Self::Chunked(response) => response.status(),
19            Self::Fixed(response) => response.status(),
20            Self::Mono(response) => response.status(),
21        }
22    }
23}
24
25impl Serve<'static> {
26    pub fn into_response(self) -> Response {
27        match self {
28            Self::Chunked(response) => response.into_response(),
29            Self::Fixed(response) => Response::from(response),
30            Self::Mono(response) => Response::from(response),
31        }
32    }
33}
34
35impl From<Response> for Serve<'static> {
36    fn from(value: Response) -> Self {
37        if let Some(parts) = value.chunked_parts {
38            return Self::Chunked(Chunked::from_parts(
39                value.status,
40                value.headers,
41                o3::buffer::Shared::from(value.wire_headers),
42                parts,
43            ));
44        }
45        let headers = if value.headers.is_empty() {
46            None
47        } else {
48            Some(Box::new(value.headers))
49        };
50        Self::Mono(MonoResponseInner {
51            status: value.status,
52            headers,
53            head: HotHeadInner::Wire(o3::buffer::Shared::from(value.wire_headers)),
54            body: value.body,
55        })
56    }
57}
58
59impl<'req, const N: usize> From<MonoResponseInner<'req, N>> for Serve<'req, N> {
60    fn from(value: MonoResponseInner<'req, N>) -> Self {
61        Self::Mono(value)
62    }
63}
64
65impl<'req, const N: usize> From<FixedResponse<'req, N>> for Serve<'req, N> {
66    fn from(value: FixedResponse<'req, N>) -> Self {
67        Self::Fixed(value)
68    }
69}