sark_core/http/response/
serve.rs1use 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}