cleanup
[pspp] / rust / src / main.rs
index 2251b760fe7dab58b5ae78d60b9cc7258853b906..404e96d57d07becaf09c4688319a0ac3739ceee4 100644 (file)
@@ -18,7 +18,7 @@ use anyhow::Result;
 use clap::{Parser, ValueEnum};
 use encoding_rs::Encoding;
 use pspp::cooked::decode;
-use pspp::raw::{Reader, Record};
+use pspp::raw::{Reader, Record, Magic};
 use std::fs::File;
 use std::io::BufReader;
 use std::path::{Path, PathBuf};
@@ -59,6 +59,7 @@ fn parse_encoding(arg: &str) -> Result<&'static Encoding, UnknownEncodingError>
 
 #[derive(Clone, Copy, Debug, Default, ValueEnum)]
 enum Mode {
+    Identify,
     Raw,
     #[default]
     Cooked,
@@ -83,14 +84,24 @@ fn dissect(file_name: &Path, max_cases: u64, mode: Mode, encoding: Option<&'stat
     let reader = BufReader::new(reader);
     let mut reader = Reader::new(reader)?;
 
-    let headers: Vec<Record> = reader.collect_headers()?;
     match mode {
+        Mode::Identify => {
+            let Record::Header(header) = reader.next().unwrap()? else { unreachable!() };
+            match header.magic {
+                Magic::Sav => println!("SPSS System File"),
+                Magic::Zsav => println!("SPSS System File with Zlib compression"),
+                Magic::Ebcdic => println!("EBCDIC-encoded SPSS System File"),
+            }
+            return Ok(())
+        }
         Mode::Raw => {
+            let headers: Vec<Record> = reader.collect_headers()?;
             for header in headers {
                 println!("{header:?}");
             }
         }
         Mode::Cooked => {
+            let headers: Vec<Record> = reader.collect_headers()?;
             let headers = decode(headers, encoding, &|e| panic!("{e}"))?;
             for header in headers {
                 println!("{header:?}");
@@ -99,10 +110,10 @@ fn dissect(file_name: &Path, max_cases: u64, mode: Mode, encoding: Option<&'stat
     }
 
     for _ in 0..max_cases {
-        let Some(Ok(Record::Case(data))) = reader.next() else {
+        let Some(Ok(record)) = reader.next() else {
             break;
         };
-        println!("{:?}", data);
+        println!("{:?}", record);
     }
     Ok(())
 }