easy_hex/
serialize.rs

1use serde::{Serialize, Serializer};
2
3use crate::{encode::fast_serialize, Hex, UpperHex, LOWER, UPPER};
4
5impl<T> Serialize for Hex<T>
6where
7    T: AsRef<[u8]> + ?Sized,
8{
9    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
10    where
11        S: Serializer,
12    {
13        fast_serialize::<_, _, LOWER>(&self.0, |s| serializer.serialize_str(s))
14    }
15}
16
17impl<T> Serialize for UpperHex<T>
18where
19    T: AsRef<[u8]> + ?Sized,
20{
21    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
22    where
23        S: Serializer,
24    {
25        fast_serialize::<_, _, UPPER>(&self.0, |s| serializer.serialize_str(s))
26    }
27}
28
29/// Serialize function for a hex string. Will serialize `T` as lower case
30/// hex.
31pub fn serialize<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
32where
33    S: Serializer,
34    T: AsRef<[u8]>,
35{
36    fast_serialize::<_, _, LOWER>(value, |s| serializer.serialize_str(s))
37}
38
39/// Serialize function for a hex string. Will serialize `T` as upper case
40/// hex.
41pub fn serialize_upper<T, S>(value: &T, serializer: S) -> Result<S::Ok, S::Error>
42where
43    S: Serializer,
44    T: AsRef<[u8]>,
45{
46    fast_serialize::<_, _, UPPER>(value, |s| serializer.serialize_str(s))
47}
48
49#[cfg(test)]
50mod tests {
51    use serde_derive::Serialize;
52
53    use crate::tests::to_json;
54
55    use super::*;
56
57    #[derive(Serialize)]
58    struct Test {
59        _a: Hex<Vec<u8>>,
60        _b: UpperHex<Vec<u8>>,
61        #[serde(serialize_with = "serialize")]
62        _c: Vec<u8>,
63        #[serde(serialize_with = "serialize_upper")]
64        _d: Vec<u8>,
65    }
66
67    #[test]
68    fn test_lower() {
69        let hex = Hex([1_u8, 0x99, 0xff]);
70
71        assert_eq!(to_json(&hex), r#"{"data":"0199ff"}"#);
72    }
73
74    #[test]
75    fn test_upper() {
76        let hex = UpperHex([1_u8, 0x99, 0xff]);
77
78        assert_eq!(to_json(&hex), r#"{"data":"0199FF"}"#);
79    }
80}