lychee_lib/types/
response.rs1use std::fmt::Display;
2
3use http::StatusCode;
4use serde::Serialize;
5
6use crate::{InputSource, Status, Uri};
7
8#[derive(Debug)]
17pub struct Response(InputSource, pub ResponseBody);
18
19impl Response {
20 #[inline]
21 #[must_use]
22 pub const fn new(uri: Uri, status: Status, source: InputSource) -> Self {
24 Response(source, ResponseBody { uri, status })
25 }
26
27 #[inline]
28 #[must_use]
29 pub const fn status(&self) -> &Status {
31 &self.1.status
32 }
33
34 #[inline]
35 #[must_use]
36 pub const fn source(&self) -> &InputSource {
39 &self.0
40 }
41
42 #[inline]
43 #[must_use]
44 pub const fn body(&self) -> &ResponseBody {
46 &self.1
47 }
48}
49
50impl Display for Response {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 <ResponseBody as Display>::fmt(&self.1, f)
53 }
54}
55
56impl Serialize for Response {
57 fn serialize<S>(&self, s: S) -> Result<S::Ok, S::Error>
58 where
59 S: serde::Serializer,
60 {
61 <ResponseBody as Serialize>::serialize(&self.1, s)
62 }
63}
64
65#[allow(clippy::module_name_repetitions)]
66#[derive(Debug, Serialize, Hash, PartialEq, Eq)]
67pub struct ResponseBody {
69 #[serde(flatten)]
70 pub uri: Uri,
72 pub status: Status,
74}
75
76impl Display for ResponseBody {
81 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
82 write!(f, "{}", self.uri)?;
84
85 if matches!(self.status, Status::Ok(StatusCode::OK)) {
87 return Ok(());
88 }
89
90 let status_output = self.status.to_string();
92 if status_output.is_empty() {
93 return Ok(());
94 }
95
96 write!(f, " | {status_output}")?;
98
99 if let Some(details) = self.status.details() {
101 write!(f, ": {details}")
102 } else {
103 Ok(())
104 }
105 }
106}