1
+ // core
2
+ use core:: str;
1
3
// alloc
2
4
use alloc:: format;
3
5
// crates.io
4
6
#[ 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 } ;
6
8
// self
7
9
use crate :: { prelude:: * , Dehexify , Hexify } ;
8
10
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
+
9
36
/// Serialize `T` to hex.
10
37
///
11
38
/// # Examples
@@ -130,6 +157,32 @@ where
130
157
serializer. serialize_str ( & value. hexify_prefixed ( ) )
131
158
}
132
159
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
+
133
186
/// Deserialize hex to `T`.
134
187
///
135
188
/// # Examples
@@ -168,7 +221,7 @@ where
168
221
{
169
222
let hex = <& str >:: deserialize ( hex) ?;
170
223
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:?}" ) ) )
172
225
}
173
226
174
227
/// Deserialize hex to `T` where `T: From<Vec<u8>>`.
@@ -323,6 +376,8 @@ fn serde_should_work() {
323
376
_6 : [ u8 ; 17 ] ,
324
377
#[ serde( deserialize_with = "de_dehexify" , serialize_with = "ser_hexify_prefixed_upper" ) ]
325
378
_7 : Vec < u8 > ,
379
+ #[ serde( deserialize_with = "de_bytes_destringify" , serialize_with = "ser_bytes_stringify" ) ]
380
+ _8 : Vec < u8 > ,
326
381
}
327
382
impl Default for LjfPredefined {
328
383
fn default ( ) -> Self {
@@ -335,6 +390,7 @@ fn serde_should_work() {
335
390
_5 : 5_201_314 ,
336
391
_6 : * b"Love Jane Forever" ,
337
392
_7 : b"Love Jane Forever" . to_vec ( ) ,
393
+ _8 : b"Love Jane Forever" . to_vec ( ) ,
338
394
}
339
395
}
340
396
}
@@ -346,7 +402,7 @@ fn serde_should_work() {
346
402
let json = result. unwrap ( ) ;
347
403
assert_eq ! (
348
404
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" }"#
350
406
) ;
351
407
352
408
let result = serde_json:: from_str :: < LjfPredefined > ( & json) ;
0 commit comments