1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
use serde::{ser, Deserializer, Serializer};

type Type = http::HeaderValue;
const EXPECT_MESSAGE: &str = "a header value";

pub fn serialize<S: Serializer>(val: &Type, ser: S) -> Result<S::Ok, S::Error> {
    if ser.is_human_readable() {
        use ser::Error;
        ser.serialize_str(val.to_str().map_err(Error::custom)?)
    } else {
        ser.serialize_bytes(val.as_ref())
    }
}

create_visitor!(
    Visitor,
    Type,
    EXPECT_MESSAGE,
    (visit_str, &str),
    (visit_string, String),
    (visit_bytes, &[u8]),
    (visit_byte_buf, Vec<u8>)
);

pub fn deserialize<'de, D>(de: D) -> Result<Type, D::Error>
where
    D: Deserializer<'de>,
{
    if de.is_human_readable() {
        de.deserialize_string(Visitor)
    } else {
        de.deserialize_byte_buf(Visitor)
    }
}

derive_extension_types!(super::Type);