compiles
[pspp] / rust / src / raw.rs
index ba7124a3856c9e9f18c384aed5f5fed787242e8a..544481906f20153aabd415e50f507b198375c73f 100644 (file)
@@ -179,6 +179,12 @@ pub enum Error {
     #[error("Invalid variable name in variable set record.  {0}")]
     InvalidVariableSetName(IdError),
 
+    #[error("Invalid multiple response set name.  {0}")]
+    InvalidMrSetName(IdError),
+
+    #[error("Invalid multiple response set variable name.  {0}")]
+    InvalidMrSetVariableName(IdError),
+
     #[error("Details TBD")]
     TBD,
 }
@@ -193,7 +199,7 @@ pub enum Record {
     FloatInfo(FloatInfoRecord),
     VariableSets(VariableSetRecord),
     VarDisplay(VarDisplayRecord),
-    MultipleResponse(MultipleResponseRecord<RawString>),
+    MultipleResponse(MultipleResponseRecord<RawString, RawString>),
     LongStringValueLabels(LongStringValueLabelRecord<RawString>),
     LongStringMissingValues(LongStringMissingValueRecord<RawString, RawStr<8>>),
     Encoding(EncodingRecord),
@@ -1643,17 +1649,18 @@ impl MultipleResponseType {
 }
 
 #[derive(Clone, Debug)]
-pub struct MultipleResponseSet<S>
+pub struct MultipleResponseSet<I, S>
 where
+    I: Debug,
     S: Debug,
 {
-    pub name: S,
+    pub name: I,
     pub label: S,
     pub mr_type: MultipleResponseType,
-    pub short_names: Vec<S>,
+    pub short_names: Vec<I>,
 }
 
-impl MultipleResponseSet<RawString> {
+impl MultipleResponseSet<RawString, RawString> {
     fn parse(input: &[u8]) -> Result<(Self, &[u8]), Error> {
         let Some(equals) = input.iter().position(|&b| b == b'=') else {
             return Err(Error::TBD);
@@ -1694,22 +1701,38 @@ impl MultipleResponseSet<RawString> {
         ))
     }
 
-    fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseSet<Cow<'a, str>> {
-        MultipleResponseSet {
-            name: decoder.decode(&self.name),
+    fn decode<'a>(
+        &'a self,
+        decoder: &Decoder,
+    ) -> Result<MultipleResponseSet<Identifier, Cow<'a, str>>, Error> {
+        let mut short_names = Vec::with_capacity(self.short_names.len());
+        for short_name in self.short_names.iter() {
+            if let Some(short_name) = decoder
+                .decode_identifier(short_name)
+                .map_err(|err| Error::InvalidMrSetName(err))
+                .warn_on_error(&decoder.warn)
+            {
+                short_names.push(short_name);
+            }
+        }
+        Ok(MultipleResponseSet {
+            name: decoder
+                .decode_identifier(&self.name)
+                .map_err(|err| Error::InvalidMrSetVariableName(err))?,
             label: decoder.decode(&self.label),
             mr_type: self.mr_type.clone(),
-            short_names: self.short_names.iter().map(|s| decoder.decode(s)).collect(),
-        }
+            short_names: short_names,
+        })
     }
 }
 
 #[derive(Clone, Debug)]
-pub struct MultipleResponseRecord<S>(pub Vec<MultipleResponseSet<S>>)
+pub struct MultipleResponseRecord<I, S>(pub Vec<MultipleResponseSet<I, S>>)
 where
+    I: Debug,
     S: Debug;
 
-impl ExtensionRecord for MultipleResponseRecord<RawString> {
+impl ExtensionRecord for MultipleResponseRecord<RawString, RawString> {
     const SUBTYPE: u32 = 7;
     const SIZE: Option<u32> = Some(1);
     const COUNT: Option<u32> = None;
@@ -1729,9 +1752,15 @@ impl ExtensionRecord for MultipleResponseRecord<RawString> {
     }
 }
 
-impl MultipleResponseRecord<RawString> {
-    fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseRecord<Cow<'a, str>> {
-        MultipleResponseRecord(self.0.iter().map(|set| set.decode(decoder)).collect())
+impl MultipleResponseRecord<RawString, RawString> {
+    fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseRecord<Identifier, Cow<'a, str>> {
+        let mut sets = Vec::new();
+        for set in self.0.iter() {
+            if let Some(set) = set.decode(decoder).warn_on_error(&decoder.warn) {
+                sets.push(set);
+            }
+        }
+        MultipleResponseRecord(sets)
     }
 }