Skip to content

Commit d940fe1

Browse files
committed
Reuse existing Buf wrapper as replacement for std::io::Write
1 parent f2899a9 commit d940fe1

File tree

4 files changed

+7
-43
lines changed

4 files changed

+7
-43
lines changed

serde/src/de/mod.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,6 @@ use crate::lib::*;
118118

119119
pub mod value;
120120

121-
mod format;
122121
mod ignored_any;
123122
mod impls;
124123
pub(crate) mod size_hint;
@@ -1374,7 +1373,7 @@ pub trait Visitor<'de>: Sized {
13741373
E: Error,
13751374
{
13761375
let mut buf = [0u8; 58];
1377-
let mut writer = format::Buf::new(&mut buf);
1376+
let mut writer = crate::format::Buf::new(&mut buf);
13781377
fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as i128", v)).unwrap();
13791378
Err(Error::invalid_type(
13801379
Unexpected::Other(writer.as_str()),
@@ -1436,7 +1435,7 @@ pub trait Visitor<'de>: Sized {
14361435
E: Error,
14371436
{
14381437
let mut buf = [0u8; 57];
1439-
let mut writer = format::Buf::new(&mut buf);
1438+
let mut writer = crate::format::Buf::new(&mut buf);
14401439
fmt::Write::write_fmt(&mut writer, format_args!("integer `{}` as u128", v)).unwrap();
14411440
Err(Error::invalid_type(
14421441
Unexpected::Other(writer.as_str()),
File renamed without changes.

serde/src/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,8 @@ mod integer128;
310310
pub mod de;
311311
pub mod ser;
312312

313+
mod format;
314+
313315
#[doc(inline)]
314316
pub use crate::de::{Deserialize, Deserializer};
315317
#[doc(inline)]

serde/src/ser/impls.rs

+3-40
Original file line numberDiff line numberDiff line change
@@ -769,31 +769,6 @@ impl Serialize for SystemTime {
769769

770770
////////////////////////////////////////////////////////////////////////////////
771771

772-
#[cfg(any(feature = "std", not(no_core_net)))]
773-
struct Wrapper<'a> {
774-
pub buf: &'a mut [u8],
775-
pub offset: usize,
776-
}
777-
778-
#[cfg(any(feature = "std", not(no_core_net)))]
779-
impl<'a> fmt::Write for Wrapper<'a> {
780-
fn write_str(&mut self, s: &str) -> fmt::Result {
781-
if self.offset > self.buf.len() {
782-
return Err(fmt::Error);
783-
}
784-
let remaining_buf = &mut self.buf[self.offset..];
785-
let raw_s = s.as_bytes();
786-
let write_num = core::cmp::min(raw_s.len(), remaining_buf.len());
787-
remaining_buf[..write_num].copy_from_slice(&raw_s[..write_num]);
788-
self.offset += raw_s.len();
789-
if write_num < raw_s.len() {
790-
Err(fmt::Error)
791-
} else {
792-
Ok(())
793-
}
794-
}
795-
}
796-
797772
/// Serialize a value that implements `Display` as a string, when that string is
798773
/// statically known to never have more than a constant `MAX_LEN` bytes.
799774
///
@@ -802,21 +777,9 @@ impl<'a> fmt::Write for Wrapper<'a> {
802777
macro_rules! serialize_display_bounded_length {
803778
($value:expr, $max:expr, $serializer:expr) => {{
804779
let mut buffer = [0u8; $max];
805-
let written_len = {
806-
let mut w = Wrapper {
807-
buf: &mut buffer,
808-
offset: 0,
809-
};
810-
write!(&mut w, "{}", $value).unwrap();
811-
w.offset
812-
};
813-
let written = &buffer[..written_len];
814-
815-
// write! only provides fmt::Formatter to Display implementations, which
816-
// has methods write_str and write_char but no method to write arbitrary
817-
// bytes. Therefore `written` must be valid UTF-8.
818-
let written_str = str::from_utf8(written).expect("must be valid UTF-8");
819-
$serializer.serialize_str(written_str)
780+
let mut writer = crate::format::Buf::new(&mut buffer);
781+
write!(&mut writer, "{}", $value).unwrap();
782+
$serializer.serialize_str(writer.as_str())
820783
}};
821784
}
822785

0 commit comments

Comments
 (0)