rocket/config/
ip_header.rs1use 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}