1use crate::serde_hex;
16use std::str;
17
18pub fn serialize_as_byte_str<S>(bytes: &[u8], serializer: S) -> Result<S::Ok, S::Error>
20where
21 S: serde::Serializer,
22{
23 if bytes.is_empty() {
24 return serializer.serialize_str("")
26 }
27 serde_hex::serialize(bytes, serializer)
28}
29
30pub fn deserialize_from_byte_str<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
32where
33 D: serde::Deserializer<'de>,
34{
35 struct Visitor;
36
37 impl serde::de::Visitor<'_> for Visitor {
38 type Value = Vec<u8>;
39
40 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
41 write!(formatter, "hex string with optional 0x prefix")
42 }
43
44 fn visit_str<E: serde::de::Error>(self, v: &str) -> Result<Self::Value, E> {
45 let result = if v.starts_with("0x") {
46 serde_hex::from_hex(v)
47 } else {
48 serde_hex::from_hex(&format!("0x{v}"))
49 };
50 result.map_err(E::custom)
51 }
52
53 fn visit_string<E: serde::de::Error>(self, v: String) -> Result<Self::Value, E> {
54 self.visit_str(&v)
55 }
56 }
57
58 deserializer.deserialize_str(Visitor)
59}
60
61pub fn trim_extra_whitespace(item: &str) -> &str {
63 if let Some(stripped) = item.strip_prefix(' ') {
64 stripped.trim_end()
65 } else {
66 item.trim_end()
67 }
68}