Skip to content

Commit 48d36e7

Browse files
authored
serdect: no_alloc implementation of serialize_hex (#2327)
This previously mandated use of `alloc` and would simply return an error when used without the feature enabled. This uses `serde`'s built-in integration with `core::fmt` along with the `base16ct::HexDisplay` type to implement a simple `no_alloc` serializer.
1 parent 6ef6b9f commit 48d36e7

1 file changed

Lines changed: 6 additions & 16 deletions

File tree

serdect/src/common.rs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,13 @@
1+
use base16ct::HexDisplay;
12
use core::fmt;
23
use core::marker::PhantomData;
3-
44
use serde::{
55
Serializer,
66
de::{Error, Unexpected, Visitor},
77
};
88

99
#[cfg(feature = "alloc")]
10-
use {alloc::vec::Vec, serde::Serialize};
11-
12-
#[cfg(not(feature = "alloc"))]
13-
use serde::ser::Error as SerError;
10+
use alloc::vec::Vec;
1411

1512
pub(crate) fn serialize_hex<S, T, const UPPERCASE: bool>(
1613
value: &T,
@@ -20,19 +17,12 @@ where
2017
S: Serializer,
2118
T: AsRef<[u8]>,
2219
{
23-
#[cfg(feature = "alloc")]
20+
let hex = HexDisplay(value.as_ref());
21+
2422
if UPPERCASE {
25-
base16ct::upper::encode_string(value.as_ref()).serialize(serializer)
23+
serializer.collect_str(&format_args!("{:X}", hex))
2624
} else {
27-
base16ct::lower::encode_string(value.as_ref()).serialize(serializer)
28-
}
29-
#[cfg(not(feature = "alloc"))]
30-
{
31-
let _ = value;
32-
let _ = serializer;
33-
Err(S::Error::custom(
34-
"serializer is human readable, which requires the `alloc` crate feature",
35-
))
25+
serializer.collect_str(&format_args!("{:x}", hex))
3626
}
3727
}
3828

0 commit comments

Comments
 (0)