1use std::fmt;
2
3use http::{HeaderName, HeaderValue};
4
5use crate::util::IterExt;
6use crate::{Error, Header};
7
8#[derive(Clone, PartialEq)]
25pub struct Expect(());
26
27impl Expect {
28    pub const CONTINUE: Expect = Expect(());
30}
31
32impl Header for Expect {
33    fn name() -> &'static HeaderName {
34        &::http::header::EXPECT
35    }
36
37    fn decode<'i, I: Iterator<Item = &'i HeaderValue>>(values: &mut I) -> Result<Self, Error> {
38        values
39            .just_one()
40            .and_then(|value| {
41                if value == "100-continue" {
42                    Some(Expect::CONTINUE)
43                } else {
44                    None
45                }
46            })
47            .ok_or_else(Error::invalid)
48    }
49
50    fn encode<E: Extend<HeaderValue>>(&self, values: &mut E) {
51        values.extend(::std::iter::once(HeaderValue::from_static("100-continue")));
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}