Skip to content

Commit 3cc642f

Browse files
committed
Release v9.1.2
1 parent 2436a35 commit 3cc642f

File tree

4 files changed

+64
-5
lines changed

4 files changed

+64
-5
lines changed

CHANGELOG

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
### v9.1.2
2+
- Add `ser_bytes_stringify` and `de_bytes_destringify`.
3+
14
### v9.1.1
25
- Integrate `serde_bytes`.
36

Cargo.lock

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ license = "Apache-2.0/GPL-3.0"
2121
name = "array-bytes"
2222
readme = "README.md"
2323
repository = "https://github.com/hack-ink/array-bytes"
24-
version = "9.1.1"
24+
version = "9.1.2"
2525

2626
[profile.ci-dev]
2727
incremental = false

src/serde.rs

+59-3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,38 @@
1+
// core
2+
use core::str;
13
// alloc
24
use 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
79
use 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

Comments
 (0)