rust: Introduce `.to_small_string()` helper trait.
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 25 Aug 2025 02:30:02 +0000 (19:30 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 25 Aug 2025 02:30:09 +0000 (19:30 -0700)
rust/pspp/src/format/display/mod.rs
rust/pspp/src/format/mod.rs
rust/pspp/src/lib.rs
rust/pspp/src/output/pivot/mod.rs
rust/pspp/src/output/spv.rs
rust/pspp/src/util.rs [new file with mode: 0644]

index 79a4c106f1decc61f9ae273cee5f1bdc2a670de1..c86e434be861614fbe2b6bba9c76443bd52d3811 100644 (file)
@@ -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),
         }
     }
 
index a9e9e7b78ba1ccaf52ae7b5b1b3a0c8cf0b6f3e5..43ba5198b81ef6764c662923817a1501bd361a15 100644 (file)
@@ -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)
     }
 }
 
index cb2ddc4f8054b3da77d0bf9bb135dc1b1f06ec62..f24d64f9895ed5234079750c258063bbbd807bc5 100644 (file)
@@ -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
index b3541f12643435bfce0d54c00b724030838e620f..6eed68e518905b627cc1099deb4679a708728ba7 100644 (file)
@@ -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>())
     }
 }
 
index 9df728fec1e5f11f95e9a6d01ec221ed7204bae8..8c44fe18ba781bf444df2daf738388cef60f5d5f 100644 (file)
@@ -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 (file)
index 0000000..bcb5069
--- /dev/null
@@ -0,0 +1,18 @@
+use std::fmt::{Display, Write};
+
+use smallstr::SmallString;
+
+pub trait ToSmallString {
+    fn to_small_string<const N: usize>(&self) -> SmallString<[u8; N]>;
+}
+
+impl<T> ToSmallString for T
+where
+    T: Display,
+{
+    fn to_small_string<const N: usize>(&self) -> SmallString<[u8; N]> {
+        let mut s = SmallString::new();
+        write!(&mut s, "{}", self).unwrap();
+        s
+    }
+}