Skip to main content

sark_core/http/response/
serve.rs

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