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