headers/common/
expect.rs
1use std::fmt;
2
3use util::IterExt;
4
5#[derive(Clone, PartialEq)]
23pub struct Expect(());
24
25impl Expect {
26 pub const CONTINUE: Expect = Expect(());
28}
29
30impl ::Header for Expect {
31 fn name() -> &'static ::HeaderName {
32 &::http::header::EXPECT
33 }
34
35 fn decode<'i, I: Iterator<Item = &'i ::HeaderValue>>(values: &mut I) -> Result<Self, ::Error> {
36 values
37 .just_one()
38 .and_then(|value| {
39 if value == "100-continue" {
40 Some(Expect::CONTINUE)
41 } else {
42 None
43 }
44 })
45 .ok_or_else(::Error::invalid)
46 }
47
48 fn encode<E: Extend<::HeaderValue>>(&self, values: &mut E) {
49 values.extend(::std::iter::once(::HeaderValue::from_static(
50 "100-continue",
51 )));
52 }
53}
54
55impl fmt::Debug for Expect {
56 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
57 f.debug_tuple("Expect").field(&"100-continue").finish()
58 }
59}
60
61#[cfg(test)]
62mod tests {
63 use super::super::test_decode;
64 use super::Expect;
65
66 #[test]
67 fn expect_continue() {
68 assert_eq!(
69 test_decode::<Expect>(&["100-continue"]),
70 Some(Expect::CONTINUE),
71 );
72 }
73
74 #[test]
75 fn expectation_failed() {
76 assert_eq!(test_decode::<Expect>(&["sandwich"]), None,);
77 }
78
79 #[test]
80 fn too_many_values() {
81 assert_eq!(
82 test_decode::<Expect>(&["100-continue", "100-continue"]),
83 None,
84 );
85 }
86}