work
[pspp] / rust / src / raw.rs
index 18e71d3623f5e4d98de552cc8653100f5b631f23..85312ef4c9e1f2260817fdef5ec1e06e0a8d7f22 100644 (file)
@@ -172,7 +172,7 @@ pub enum Record {
     FloatInfo(FloatInfoRecord),
     VariableSets(TextRecord),
     VarDisplay(VarDisplayRecord),
-    MultipleResponse(MultipleResponseRecord),
+    MultipleResponse(MultipleResponseRecord<RawString>),
     LongStringValueLabels(LongStringValueLabelRecord),
     LongStringMissingValues(LongStringMissingValueRecord),
     Encoding(EncodingRecord),
@@ -1610,15 +1610,18 @@ impl MultipleResponseType {
 }
 
 #[derive(Clone, Debug)]
-pub struct MultipleResponseSet {
-    pub name: RawString,
-    pub label: RawString,
+pub struct MultipleResponseSet<S>
+where
+    S: Debug,
+{
+    pub name: S,
+    pub label: S,
     pub mr_type: MultipleResponseType,
-    pub short_names: Vec<RawString>,
+    pub short_names: Vec<S>,
 }
 
-impl MultipleResponseSet {
-    fn parse(input: &[u8]) -> Result<(MultipleResponseSet, &[u8]), Error> {
+impl MultipleResponseSet<RawString> {
+    fn parse(input: &[u8]) -> Result<(Self, &[u8]), Error> {
         let Some(equals) = input.iter().position(|&b| b == b'=') else {
             return Err(Error::TBD);
         };
@@ -1657,12 +1660,23 @@ impl MultipleResponseSet {
             input,
         ))
     }
+
+    fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseSet<Cow<'a, str>> {
+        MultipleResponseSet {
+            name: decoder.decode(&self.name),
+            label: decoder.decode(&self.label),
+            mr_type: self.mr_type.clone(),
+            short_names: self.short_names.iter().map(|s| decoder.decode(s)).collect(),
+        }
+    }
 }
 
 #[derive(Clone, Debug)]
-pub struct MultipleResponseRecord(pub Vec<MultipleResponseSet>);
+pub struct MultipleResponseRecord<S>(pub Vec<MultipleResponseSet<S>>)
+where
+    S: Debug;
 
-impl ExtensionRecord for MultipleResponseRecord {
+impl ExtensionRecord for MultipleResponseRecord<RawString> {
     const SUBTYPE: u32 = 7;
     const SIZE: Option<u32> = Some(1);
     const COUNT: Option<u32> = None;
@@ -1682,6 +1696,12 @@ impl ExtensionRecord for MultipleResponseRecord {
     }
 }
 
+impl MultipleResponseRecord<RawString> {
+    fn decode<'a>(&'a self, decoder: &Decoder) -> MultipleResponseRecord<Cow<'a, str>> {
+        MultipleResponseRecord(self.0.iter().map(|set| set.decode(decoder)).collect())
+    }
+}
+
 fn parse_counted_string(input: &[u8]) -> Result<(RawString, &[u8]), Error> {
     let Some(space) = input.iter().position(|&b| b == b' ') else {
         return Err(Error::TBD);