multiple response
[pspp] / rust / src / raw.rs
index a9f463425c8e348c3f0929161ecceaee251ce8a9..a8c8ff7b466015cae3bd2734ca52f6c7cc939f5c 100644 (file)
@@ -1,5 +1,4 @@
 use crate::endian::{Endian, Parse, ToBytes};
-use crate::{CategoryLabels, Compression};
 
 use encoding_rs::mem::decode_latin1;
 use flate2::read::ZlibDecoder;
@@ -177,6 +176,12 @@ fn default_decode<'a>(s: &'a [u8]) -> Cow<'a, str> {
     from_utf8(s).map_or_else(|_| decode_latin1(s), Cow::from)
 }
 
+#[derive(Copy, Clone, Debug)]
+pub enum Compression {
+    Simple,
+    ZLib,
+}
+
 #[derive(Clone)]
 pub struct HeaderRecord {
     /// Magic number.
@@ -1197,6 +1202,12 @@ impl ExtensionRecord for FloatInfoRecord {
     }
 }
 
+#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub enum CategoryLabels {
+    VarLabels,
+    CountedValues,
+}
+
 #[derive(Clone, Debug)]
 pub enum MultipleResponseType {
     MultipleDichotomy {
@@ -1205,20 +1216,9 @@ pub enum MultipleResponseType {
     },
     MultipleCategory,
 }
-#[derive(Clone, Debug)]
-pub struct MultipleResponseSet {
-    pub name: UnencodedString,
-    pub label: UnencodedString,
-    pub mr_type: MultipleResponseType,
-    pub short_names: Vec<UnencodedString>,
-}
 
-impl MultipleResponseSet {
-    fn parse(input: &[u8]) -> Result<(MultipleResponseSet, &[u8]), Error> {
-        let Some(equals) = input.iter().position(|&b| b == b'=') else {
-            return Err(Error::TBD);
-        };
-        let (name, input) = input.split_at(equals);
+impl MultipleResponseType {
+    fn parse(input: &[u8]) -> Result<(MultipleResponseType, &[u8]), Error> {
         let (mr_type, input) = match input.get(0) {
             Some(b'C') => (MultipleResponseType::MultipleCategory, &input[1..]),
             Some(b'D') => {
@@ -1254,6 +1254,25 @@ impl MultipleResponseSet {
             }
             _ => return Err(Error::TBD),
         };
+        Ok((mr_type, input))
+    }
+}
+
+#[derive(Clone, Debug)]
+pub struct MultipleResponseSet {
+    pub name: UnencodedString,
+    pub label: UnencodedString,
+    pub mr_type: MultipleResponseType,
+    pub short_names: Vec<UnencodedString>,
+}
+
+impl MultipleResponseSet {
+    fn parse(input: &[u8]) -> Result<(MultipleResponseSet, &[u8]), Error> {
+        let Some(equals) = input.iter().position(|&b| b == b'=') else {
+            return Err(Error::TBD);
+        };
+        let (name, input) = input.split_at(equals);
+        let (mr_type, input) = MultipleResponseType::parse(input)?;
         let Some(b' ') = input.get(0) else {
             return Err(Error::TBD);
         };
@@ -1288,7 +1307,7 @@ impl MultipleResponseSet {
 }
 
 #[derive(Clone, Debug)]
-pub struct MultipleResponseRecord(Vec<MultipleResponseSet>);
+pub struct MultipleResponseRecord(pub Vec<MultipleResponseSet>);
 
 impl ExtensionRecord for MultipleResponseRecord {
     const SUBTYPE: u32 = 7;
@@ -1466,7 +1485,10 @@ pub struct TextRecord {
 
 impl From<Extension> for TextRecord {
     fn from(source: Extension) -> Self {
-        TextRecord { offset: source.offset, text: source.data.into() }
+        TextRecord {
+            offset: source.offset,
+            text: source.data.into(),
+        }
     }
 }