succcess
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 28 Jul 2025 16:52:42 +0000 (09:52 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 28 Jul 2025 16:52:42 +0000 (09:52 -0700)
rust/pspp/src/data.rs
rust/pspp/src/format/display/mod.rs
rust/pspp/src/format/display/test.rs
rust/pspp/src/output/pivot/mod.rs
rust/pspp/src/sys/test.rs

index 3f9eda1046d6d2bc9c94e44d51e3700bd3bb238e..2bca7c2c9911fd96567a39b11abb832d55ba7872 100644 (file)
@@ -333,6 +333,10 @@ where
             _ => false,
         }
     }
+
+    pub fn quoted(&self) -> QuotedEncodedDatum<'_> {
+        QuotedEncodedDatum(self.borrowed())
+    }
 }
 
 impl<D> EncodedDatum<D> {
@@ -397,10 +401,6 @@ impl EncodedDatum {
             Self::String(s) => s.trim_end(),
         }
     }
-
-    pub fn quoted(&self) -> QuotedEncodedDatum<'_> {
-        QuotedEncodedDatum(self.borrowed())
-    }
 }
 
 impl Display for EncodedDatum {
index b1626bf58801fc472e28ed32544d831b9c7b9c28..fe69aba6c6c96bc4d1af6ea1039712a83031736f 100644 (file)
@@ -15,6 +15,7 @@
 // this program.  If not, see <http://www.gnu.org/licenses/>.
 
 use std::{
+    borrow::Borrow,
     cmp::min,
     fmt::{Display, Error as FmtError, Formatter, Result as FmtResult, Write as _},
     io::{Error as IoError, Write as IoWrite},
@@ -29,7 +30,10 @@ use smallvec::{Array, SmallVec};
 
 use crate::{
     calendar::{calendar_offset_to_gregorian, day_of_year, month_name, short_month_name},
-    data::{EncodedDat, EncodedDatum, QuotedEncodedDatum},
+    data::{
+        BorrowedEncodedDatum, BorrowedRawString, EncodedDat, EncodedDatum, EncodedString,
+        QuotedEncodedDatum,
+    },
     endian::{endian_to_smallvec, ToBytes},
     format::{Category, DateTemplate, Decimal, Format, NumberStyle, Settings, TemplateItem, Type},
     settings::{EndianSettings, Settings as PsppSettings},
@@ -39,7 +43,7 @@ pub struct DisplayDatum<'a, 'b> {
     format: Format,
     settings: &'b Settings,
     endian: EndianSettings,
-    datum: EncodedDat<'a>,
+    datum: BorrowedEncodedDatum<'a>,
 
     /// If true, the output will remove leading and trailing spaces from numeric
     /// values, and trailing spaces from string values.  (This might make the
@@ -82,21 +86,10 @@ impl Display for DisplayPlainF64 {
     }
 }
 
-impl EncodedDat<'_> {
-    /// Returns an object that implements [Display] for printing this
-    /// [EncodedDatum] as `format`.
-    ///
-    /// [Display]: std::fmt::Display
-    pub fn display(&self, format: Format) -> DisplayDatum {
-        DisplayDatum::new(format, *self)
-    }
-
-    pub fn display_plain(&self) -> QuotedEncodedDatum<'_> {
-        self.quoted()
-    }
-}
-
-impl EncodedDatum {
+impl<R> EncodedDatum<EncodedString<R>>
+where
+    R: Borrow<BorrowedRawString>,
+{
     /// Returns an object that implements [Display] for printing this
     /// [EncodedDatum] as `format`.
     ///
@@ -113,8 +106,8 @@ impl EncodedDatum {
 impl Display for DisplayDatum<'_, '_> {
     fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
         let number = match self.datum {
-            EncodedDat::Number(number) => number,
-            EncodedDat::String(string) => {
+            EncodedDatum::Number(number) => number,
+            EncodedDatum::String(string) => {
                 if self.format.type_() == Type::AHex {
                     for byte in string.as_bytes() {
                         write!(f, "{byte:02x}")?;
@@ -173,7 +166,7 @@ impl Display for DisplayDatum<'_, '_> {
 }
 
 impl<'a, 'b> DisplayDatum<'a, 'b> {
-    pub fn new(format: Format, datum: EncodedDat<'a>) -> Self {
+    pub fn new(format: Format, datum: BorrowedEncodedDatum<'a>) -> Self {
         let settings = PsppSettings::global();
         Self {
             format,
index f684519776a6e3cdcaff402417fd28cb97aa895a..4b2fe81c7d95e25940aa4ab385c7c63e9d5eff9e 100644 (file)
@@ -23,7 +23,7 @@ use smallstr::SmallString;
 use smallvec::SmallVec;
 
 use crate::{
-    data::{ EncodedDatum},
+    data::{EncodedDatum, OwnedEncodedDatum},
     endian::Endian,
     format::{AbstractFormat, Epoch, Format, Settings, Type, UncheckedFormat, CC},
     lex::{scan::StringScanner, segment::Syntax, Punct, Token},
@@ -75,7 +75,7 @@ fn test(name: &str) {
                 let format: Format = format.try_into().unwrap();
                 assert_eq!(tokens.get(1), Some(&Token::Punct(Punct::Colon)));
                 let expected = tokens[2].as_string().unwrap();
-                let actual = EncodedDatum::Number(value)
+                let actual = OwnedEncodedDatum::Number(value)
                     .display(format)
                     .with_settings(&settings)
                     .with_endian(endian)
@@ -266,7 +266,7 @@ fn test_binhex(name: &str) {
                 assert_eq!(tokens.get(1), Some(&Token::Punct(Punct::Colon)));
                 let expected = tokens[2].as_string().unwrap();
                 let mut actual = SmallVec::<[u8; 16]>::new();
-                EncodedDatum::Number(value)
+                OwnedEncodedDatum::Number(value)
                     .display(format)
                     .with_endian(endian)
                     .write(&mut actual, UTF_8)
index ad29d5b6d4ccbd6e1494e4c7299a2f1eb5082626..1d6cd96d22fba473886e6986fa40e4dd80b0ad5e 100644 (file)
@@ -68,7 +68,10 @@ use thiserror::Error as ThisError;
 use tlo::parse_tlo;
 
 use crate::{
-    data::{BorrowedRawString, Datum, EncodedDat, EncodedDatum, EncodedString, OwnedRawString},
+    data::{
+        BorrowedRawString, Datum, EncodedDat, EncodedDatum, EncodedString, OwnedEncodedDatum,
+        OwnedRawString,
+    },
     dictionary::{VarType, Variable},
     format::{Decimal, Format, Settings as FormatSettings, Type, UncheckedFormat},
     settings::{Settings, Show},
@@ -1865,8 +1868,8 @@ impl Value {
         R: Borrow<BorrowedRawString>,
     {
         match value {
-            EncodedDat::Number(number) => Self::new_number(number),
-            EncodedDat::String(string) => Self::new_user_text(string.as_str()),
+            EncodedDatum::Number(number) => Self::new_number(*number),
+            EncodedDatum::String(string) => Self::new_user_text(string.as_str()),
         }
     }
     pub fn new_variable_value(variable: &Variable, value: &Datum<OwnedRawString>) -> Self {
@@ -2209,7 +2212,12 @@ impl Display for DisplayValue<'_> {
                         *format
                     };
                     let mut buf = SmallString::<[u8; 40]>::new();
-                    write!(&mut buf, "{}", EncodedDat::Number(*value).display(format)).unwrap();
+                    write!(
+                        &mut buf,
+                        "{}",
+                        OwnedEncodedDatum::Number(*value).display(format)
+                    )
+                    .unwrap();
                     write!(f, "{}", buf.trim_start_matches(' '))?;
                 }
                 if let Some(label) = self.show_label {
index aa1714124a70b5384eeb164f11955fc61a8f2eb6..f19924c2d8ccb8e08f1c3cba06ccb1d378da35f4 100644 (file)
@@ -666,7 +666,7 @@ where
                             .push(Value::new_integer(Some((case_numbers.len() + 1) as f64)));
                         data.push(
                             case.into_iter()
-                                .map(|datum| Value::new_datum(datum.borrowed()))
+                                .map(|datum| Value::new_datum(&datum))
                                 .collect::<Vec<_>>(),
                         );
                     }