rocket/config/
ip_header.rs

1use std::fmt;
2
3use serde::de;
4
5use crate::http::Header;
6use crate::http::uncased::Uncased;
7
8pub(crate) fn deserialize<'de, D>(de: D) -> Result<Option<Uncased<'static>>, D::Error>
9    where D: de::Deserializer<'de>
10{
11    struct Visitor;
12
13    impl<'de> de::Visitor<'de> for Visitor {
14        type Value = Option<Uncased<'static>>;
15
16        fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
17            formatter.write_str("a valid header name or `false`")
18        }
19
20        fn visit_bool<E: de::Error>(self, v: bool) -> Result<Self::Value, E> {
21            if !v {
22                return Ok(None);
23            }
24
25            Err(E::invalid_value(de::Unexpected::Bool(v), &self))
26        }
27
28        fn visit_some<D>(self, de: D) -> Result<Self::Value, D::Error>
29            where D: de::Deserializer<'de>
30        {
31            de.deserialize_string(self)
32        }
33
34        fn visit_none<E: de::Error>(self) -> Result<Self::Value, E> {
35            Ok(None)
36        }
37
38        fn visit_unit<E: de::Error>(self) -> Result<Self::Value, E> {
39            Ok(None)
40        }
41
42        fn visit_str<E: de::Error>(self, v: &str) -> Result<Self::Value, E> {
43            self.visit_string(v.into())
44        }
45
46        fn visit_string<E: de::Error>(self, v: String) -> Result<Self::Value, E> {
47            if Header::is_valid_name(&v) {
48                Ok(Some(Uncased::from_owned(v)))
49            } else {
50                Err(E::invalid_value(de::Unexpected::Str(&v), &self))
51            }
52        }
53    }
54
55    de.deserialize_string(Visitor)
56}