Skip to content

Commit 0d53c6e

Browse files
committed
Implement Debug for Headers and related structs
1 parent fd8d729 commit 0d53c6e

File tree

4 files changed

+87
-6
lines changed

4 files changed

+87
-6
lines changed

src/headers/header_name.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::str::FromStr;
55
use crate::Error;
66

77
/// A header name.
8-
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
8+
#[derive(Clone, PartialEq, Eq, Hash)]
99
pub struct HeaderName(Cow<'static, str>);
1010

1111
impl HeaderName {
@@ -49,6 +49,12 @@ impl HeaderName {
4949
}
5050
}
5151

52+
impl Debug for HeaderName {
53+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
54+
write!(f, "{:?}", self.0)
55+
}
56+
}
57+
5258
impl Display for HeaderName {
5359
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
5460
write!(f, "{}", self.0)
@@ -150,4 +156,10 @@ mod tests {
150156
let mut res = crate::Response::new(200);
151157
res.insert_header(&crate::headers::HOST, "127.0.0.1");
152158
}
159+
160+
#[test]
161+
fn test_debug() {
162+
let header_name = HeaderName::from_str("hello").unwrap();
163+
assert_eq!(format!("{:?}", header_name), "\"hello\"");
164+
}
153165
}

src/headers/header_value.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
use std::convert::TryFrom;
2-
use std::fmt::{self, Display};
2+
use std::fmt::{self, Debug, Display};
33
use std::str::FromStr;
44

55
use crate::headers::HeaderValues;
66
use crate::Error;
77
use crate::{Cookie, Mime};
88

99
/// A header value.
10-
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
10+
#[derive(Clone, Eq, PartialEq, Hash)]
1111
pub struct HeaderValue {
1212
inner: String,
1313
}
@@ -92,6 +92,12 @@ impl<'a> TryFrom<&'a str> for HeaderValue {
9292
}
9393
}
9494

95+
impl Debug for HeaderValue {
96+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
97+
write!(f, "{:?}", self.inner)
98+
}
99+
}
100+
95101
impl Display for HeaderValue {
96102
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
97103
write!(f, "{}", self.inner)
@@ -131,3 +137,14 @@ impl From<HeaderValues> for HeaderValue {
131137
.expect("HeaderValues should contain at least one value")
132138
}
133139
}
140+
141+
#[cfg(test)]
142+
mod tests {
143+
use super::*;
144+
145+
#[test]
146+
fn test_debug() {
147+
let header_value = HeaderValue::from_str("foo0").unwrap();
148+
assert_eq!(format!("{:?}", header_value), "\"foo0\"");
149+
}
150+
}

src/headers/header_values.rs

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use crate::headers::{HeaderValue, Values};
22

3-
use std::fmt::{self, Display};
3+
use std::fmt::{self, Debug, Display};
44
use std::iter::FromIterator;
55
use std::ops::{Deref, DerefMut, Index};
66
use std::slice::SliceIndex;
77

88
/// A list of `HeaderValue`s.
99
///
1010
/// This always contains at least one header value.
11-
#[derive(Debug, Clone)]
11+
#[derive(Clone)]
1212
pub struct HeaderValues {
1313
pub(crate) inner: Vec<HeaderValue>,
1414
}
@@ -73,6 +73,16 @@ impl FromIterator<HeaderValue> for HeaderValues {
7373
}
7474
}
7575

76+
impl Debug for HeaderValues {
77+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
78+
if self.inner.len() == 1 {
79+
write!(f, "{:?}", self.inner[0])
80+
} else {
81+
f.debug_list().entries(self.inner.iter()).finish()
82+
}
83+
}
84+
}
85+
7686
impl Display for HeaderValues {
7787
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
7888
let mut list = f.debug_list();
@@ -153,3 +163,23 @@ impl<'a> IntoIterator for &'a HeaderValues {
153163
self.iter()
154164
}
155165
}
166+
167+
#[cfg(test)]
168+
mod tests {
169+
use super::*;
170+
171+
#[test]
172+
fn test_debug_single() {
173+
let header_values = HeaderValues {
174+
inner: vec!["foo0".parse().unwrap()],
175+
};
176+
assert_eq!(format!("{:?}", header_values), "\"foo0\"");
177+
}
178+
#[test]
179+
fn test_debug_multiple() {
180+
let header_values = HeaderValues {
181+
inner: vec!["foo0".parse().unwrap(), "foo1".parse().unwrap()],
182+
};
183+
assert_eq!(format!("{:?}", header_values), r#"["foo0", "foo1"]"#);
184+
}
185+
}

src/headers/headers.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
33
use std::collections::HashMap;
44
use std::convert::Into;
5+
use std::fmt::{self, Debug};
56
use std::iter::IntoIterator;
67
use std::ops::Index;
78
use std::str::FromStr;
@@ -26,7 +27,7 @@ use crate::headers::{
2627
/// res.insert_header("hello", "foo0");
2728
/// assert_eq!(res["hello"], "foo0");
2829
/// ```
29-
#[derive(Debug, Clone)]
30+
#[derive(Clone)]
3031
pub struct Headers {
3132
pub(crate) headers: HashMap<HeaderName, HeaderValues>,
3233
}
@@ -176,6 +177,12 @@ impl<'a> IntoIterator for &'a mut Headers {
176177
}
177178
}
178179

180+
impl Debug for Headers {
181+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
182+
f.debug_map().entries(self.headers.iter()).finish()
183+
}
184+
}
185+
179186
#[cfg(test)]
180187
mod tests {
181188
use super::*;
@@ -207,4 +214,19 @@ mod tests {
207214
assert_eq!(headers["hello"], "foo0");
208215
assert_eq!(headers.get("hello").unwrap(), "foo0");
209216
}
217+
218+
#[test]
219+
fn test_debug_single() {
220+
let mut headers = Headers::new();
221+
headers.insert("single", "foo0");
222+
assert_eq!(format!("{:?}", headers), r#"{"single": "foo0"}"#);
223+
}
224+
225+
#[test]
226+
fn test_debug_multiple() {
227+
let mut headers = Headers::new();
228+
headers.append("multi", "foo0");
229+
headers.append("multi", "foo1");
230+
assert_eq!(format!("{:?}", headers), r#"{"multi": ["foo0", "foo1"]}"#);
231+
}
210232
}

0 commit comments

Comments
 (0)