1+ // core
2+ use core:: str;
13// alloc
24use alloc:: format;
35// crates.io
46#[ cfg( test) ] use serde:: Serialize ;
5- use serde:: { de:: Error as DeError , Deserialize , Deserializer , Serializer } ;
7+ use serde:: { de:: Error as _ , ser :: Error as _ , Deserialize , Deserializer , Serializer } ;
68// self
79use crate :: { prelude:: * , Dehexify , Hexify } ;
810
11+ /// Serialize bytes to string.
12+ ///
13+ /// # Examples
14+ /// ```
15+ /// use serde::Serialize;
16+ ///
17+ /// #[derive(Debug, PartialEq, Serialize)]
18+ /// struct Ljf {
19+ /// #[serde(serialize_with = "array_bytes::ser_bytes_stringify")]
20+ /// _0: Vec<u8>,
21+ /// }
22+ ///
23+ /// assert_eq!(
24+ /// serde_json::to_string::<Ljf>(&Ljf { _0: b"Love Jane Forever".to_vec() }).unwrap(),
25+ /// r#"{"_0":"Love Jane Forever"}"#
26+ /// );
27+ /// ```
28+ pub fn ser_bytes_stringify < S , T > ( value : & T , serializer : S ) -> Result < S :: Ok , S :: Error >
29+ where
30+ S : Serializer ,
31+ T : AsRef < [ u8 ] > ,
32+ {
33+ serializer. serialize_str ( str:: from_utf8 ( value. as_ref ( ) ) . map_err ( S :: Error :: custom) ?)
34+ }
35+
936/// Serialize `T` to hex.
1037///
1138/// # Examples
@@ -130,6 +157,32 @@ where
130157 serializer. serialize_str ( & value. hexify_prefixed ( ) )
131158}
132159
160+ /// Deserialize string to bytes.
161+ ///
162+ /// # Examples
163+ /// ```
164+ /// use serde::Deserialize;
165+ ///
166+ /// #[derive(Debug, PartialEq, Deserialize)]
167+ /// struct Ljf {
168+ /// #[serde(deserialize_with = "array_bytes::de_bytes_destringify")]
169+ /// _0: Vec<u8>,
170+ /// }
171+ ///
172+ /// assert_eq!(
173+ /// serde_json::from_str::<Ljf>(r#"{"_0":"Love Jane Forever"}"#).unwrap(),
174+ /// Ljf { _0: b"Love Jane Forever".to_vec() }
175+ /// );
176+ /// ```
177+ pub fn de_bytes_destringify < ' de , D > ( str : D ) -> Result < Vec < u8 > , D :: Error >
178+ where
179+ D : Deserializer < ' de > ,
180+ {
181+ let str = <& str >:: deserialize ( str) ?;
182+
183+ Ok ( str. as_bytes ( ) . to_vec ( ) )
184+ }
185+
133186/// Deserialize hex to `T`.
134187///
135188/// # Examples
@@ -168,7 +221,7 @@ where
168221{
169222 let hex = <& str >:: deserialize ( hex) ?;
170223
171- T :: dehexify ( hex) . map_err ( |_ | D :: Error :: custom ( alloc:: format!( "invalid hex str `{}`" , hex ) ) )
224+ T :: dehexify ( hex) . map_err ( |e | D :: Error :: custom ( alloc:: format!( "{e:?}" ) ) )
172225}
173226
174227/// Deserialize hex to `T` where `T: From<Vec<u8>>`.
@@ -323,6 +376,8 @@ fn serde_should_work() {
323376 _6 : [ u8 ; 17 ] ,
324377 #[ serde( deserialize_with = "de_dehexify" , serialize_with = "ser_hexify_prefixed_upper" ) ]
325378 _7 : Vec < u8 > ,
379+ #[ serde( deserialize_with = "de_bytes_destringify" , serialize_with = "ser_bytes_stringify" ) ]
380+ _8 : Vec < u8 > ,
326381 }
327382 impl Default for LjfPredefined {
328383 fn default ( ) -> Self {
@@ -335,6 +390,7 @@ fn serde_should_work() {
335390 _5 : 5_201_314 ,
336391 _6 : * b"Love Jane Forever" ,
337392 _7 : b"Love Jane Forever" . to_vec ( ) ,
393+ _8 : b"Love Jane Forever" . to_vec ( ) ,
338394 }
339395 }
340396 }
@@ -346,7 +402,7 @@ fn serde_should_work() {
346402 let json = result. unwrap ( ) ;
347403 assert_eq ! (
348404 json,
349- r#"{"_0":"34","_1":"208","_2":"0x4f5da2","_3":"0x4f5da2","_4":"4f5da2","_5":"4F5DA2","_6":"0x4c6f7665204a616e6520466f7265766572","_7":"0x4c6f7665204a616e6520466f7265766572"}"#
405+ r#"{"_0":"34","_1":"208","_2":"0x4f5da2","_3":"0x4f5da2","_4":"4f5da2","_5":"4F5DA2","_6":"0x4c6f7665204a616e6520466f7265766572","_7":"0x4c6f7665204a616e6520466f7265766572","_8":"Love Jane Forever" }"#
350406 ) ;
351407
352408 let result = serde_json:: from_str :: < LjfPredefined > ( & json) ;
0 commit comments