From 8fcf023aa83b1bd94aae84c4761f9004fe3c83b7 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Sun, 24 Aug 2025 19:30:02 -0700 Subject: [PATCH] rust: Introduce `.to_small_string()` helper trait. --- rust/pspp/src/format/display/mod.rs | 13 ++++--------- rust/pspp/src/format/mod.rs | 6 ++---- rust/pspp/src/lib.rs | 1 + rust/pspp/src/output/pivot/mod.rs | 13 ++++--------- rust/pspp/src/output/spv.rs | 8 +++----- rust/pspp/src/util.rs | 18 ++++++++++++++++++ 6 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 rust/pspp/src/util.rs diff --git a/rust/pspp/src/format/display/mod.rs b/rust/pspp/src/format/display/mod.rs index 79a4c106f1..c86e434be8 100644 --- a/rust/pspp/src/format/display/mod.rs +++ b/rust/pspp/src/format/display/mod.rs @@ -34,6 +34,7 @@ use crate::{ endian::ToBytes, format::{Category, DateTemplate, Decimal, Format, NumberStyle, Settings, TemplateItem, Type}, settings::{EndianSettings, Settings as PsppSettings}, + util::ToSmallString, }; pub struct DisplayDatum<'b, B> { @@ -103,8 +104,7 @@ impl Display for DisplayPlainF64 { match self.decimal { '.' => write!(f, "{}", Inner(self.value)), _ => { - let mut tmp = SmallString::<[u8; 64]>::new(); - write!(&mut tmp, "{}", Inner(self.value)).unwrap(); + let tmp = Inner(self.value).to_small_string::<64>(); if let Some(position) = tmp.find('.') { f.write_str(&tmp[..position])?; f.write_char(self.decimal)?; @@ -526,8 +526,7 @@ where if len > w { self.overflow(f) } else { - let mut s = SmallString::<[u8; 40]>::new(); - write!(&mut s, "{legacy}")?; + let mut s = legacy.to_small_string::<40>(); if number < 0.0 { if let Some(last) = s.pop() { let last = last.to_digit(10).unwrap(); @@ -698,11 +697,7 @@ where None if encoding == UTF_8 => { write!(&mut w, "{}", self) } - None => { - let mut temp = SmallString::<[u8; 64]>::new(); - write!(&mut temp, "{}", self).unwrap(); - w.write_all(&encoding.encode(&temp).0) - } + None => w.write_all(&encoding.encode(&self.to_small_string::<64>()).0), } } diff --git a/rust/pspp/src/format/mod.rs b/rust/pspp/src/format/mod.rs index a9e9e7b78b..43ba5198b8 100644 --- a/rust/pspp/src/format/mod.rs +++ b/rust/pspp/src/format/mod.rs @@ -25,13 +25,13 @@ use chrono::{Datelike, Local}; use enum_iterator::{all, Sequence}; use enum_map::{Enum, EnumMap}; use serde::{Deserialize, Serialize}; -use smallstr::SmallString; use thiserror::Error as ThisError; use unicode_width::UnicodeWidthStr; use crate::{ data::{ByteString, Datum}, sys::raw, + util::ToSmallString, variable::{VarType, VarWidth}, }; @@ -495,9 +495,7 @@ impl Serialize for Format { where S: serde::Serializer, { - let mut s = SmallString::<[u8; 16]>::new(); - write!(&mut s, "{}", self).unwrap(); - s.serialize(serializer) + self.to_small_string::<16>().serialize(serializer) } } diff --git a/rust/pspp/src/lib.rs b/rust/pspp/src/lib.rs index cb2ddc4f80..f24d64f989 100644 --- a/rust/pspp/src/lib.rs +++ b/rust/pspp/src/lib.rs @@ -35,6 +35,7 @@ pub mod output; pub mod prompt; pub mod settings; pub mod sys; +pub mod util; pub mod variable; /// This is [slice::element_offset] copied out from the standard library so that diff --git a/rust/pspp/src/output/pivot/mod.rs b/rust/pspp/src/output/pivot/mod.rs index b3541f1264..6eed68e518 100644 --- a/rust/pspp/src/output/pivot/mod.rs +++ b/rust/pspp/src/output/pivot/mod.rs @@ -74,6 +74,7 @@ use crate::{ data::{ByteString, Datum, EncodedString, RawString}, format::{Decimal, Format, Settings as FormatSettings, Type, UncheckedFormat}, settings::{Settings, Show}, + util::ToSmallString, variable::{VarType, Variable}, }; @@ -125,9 +126,7 @@ impl Serialize for Area { where S: serde::Serializer, { - let mut s = SmallString::<[u8; 16]>::new(); - write!(&mut s, "{}", self).unwrap(); - serializer.serialize_str(&s) + serializer.serialize_str(&self.to_small_string::<16>()) } } @@ -235,9 +234,7 @@ impl Serialize for Border { where S: serde::Serializer, { - let mut s = SmallString::<[u8; 32]>::new(); - write!(&mut s, "{}", self).unwrap(); - serializer.serialize_str(&s) + serializer.serialize_str(&self.to_small_string::<32>()) } } @@ -1129,9 +1126,7 @@ impl Serialize for Color { where S: serde::Serializer, { - let mut s = SmallString::<[u8; 32]>::new(); - write!(&mut s, "{}", self.display_css()).unwrap(); - serializer.serialize_str(&s) + serializer.serialize_str(&self.display_css().to_small_string::<32>()) } } diff --git a/rust/pspp/src/output/spv.rs b/rust/pspp/src/output/spv.rs index 9df728fec1..8c44fe18ba 100644 --- a/rust/pspp/src/output/spv.rs +++ b/rust/pspp/src/output/spv.rs @@ -17,7 +17,6 @@ use core::f64; use std::{ borrow::Cow, - fmt::Write as _, fs::File, io::{Cursor, Seek, Write}, iter::{repeat, repeat_n}, @@ -34,7 +33,6 @@ use quick_xml::{ ElementWriter, }; use serde::{Deserialize, Serialize}; -use smallstr::SmallString; use zip::{result::ZipResult, write::SimpleFileOptions, ZipWriter}; use crate::{ @@ -51,6 +49,7 @@ use crate::{ Item, Text, }, settings::Show, + util::ToSmallString, }; fn light_table_name(table_id: u64) -> String { @@ -1040,9 +1039,8 @@ impl BinWrite for Color { endian: Endian, args: Self::Args<'_>, ) -> binrw::BinResult<()> { - let mut s = SmallString::<[u8; 16]>::new(); - write!(&mut s, "{}", self.without_alpha().display_css()).unwrap(); - SpvString(&s).write_options(writer, endian, args) + SpvString(&self.without_alpha().display_css().to_small_string::<16>()) + .write_options(writer, endian, args) } } diff --git a/rust/pspp/src/util.rs b/rust/pspp/src/util.rs new file mode 100644 index 0000000000..bcb506966a --- /dev/null +++ b/rust/pspp/src/util.rs @@ -0,0 +1,18 @@ +use std::fmt::{Display, Write}; + +use smallstr::SmallString; + +pub trait ToSmallString { + fn to_small_string(&self) -> SmallString<[u8; N]>; +} + +impl ToSmallString for T +where + T: Display, +{ + fn to_small_string(&self) -> SmallString<[u8; N]> { + let mut s = SmallString::new(); + write!(&mut s, "{}", self).unwrap(); + s + } +} -- 2.30.2