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
29pub 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
39pub 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}