1use std::io::{self, Seek};
5use std::time::Instant;
6
7use mzdata::io::{
8 infer_from_stream, MassSpectrometryFormat, PreBufferedStream, RestartableGzDecoder,
9 SpectrumSource,
10};
11use mzdata::{MGFReader, MzMLReader};
12
13fn main() -> io::Result<()> {
14 env_logger::init();
15 let start = Instant::now();
16 let stream = io::stdin();
17 let mut stream = PreBufferedStream::new(stream)?;
18 let (fmt, compressed) = infer_from_stream(&mut stream)?;
19 stream.seek(io::SeekFrom::Start(0))?;
20 let groups: Vec<_> = match fmt {
21 MassSpectrometryFormat::MGF => {
22 if compressed {
23 MGFReader::new(RestartableGzDecoder::new(io::BufReader::new(stream)))
24 .into_groups()
25 .collect()
26 } else {
27 MGFReader::new(stream).into_groups().collect()
28 }
29 }
30 MassSpectrometryFormat::MzML => {
31 if compressed {
32 MzMLReader::new(RestartableGzDecoder::new(io::BufReader::new(stream)))
33 .into_groups()
34 .collect()
35 } else {
36 MzMLReader::new(stream).into_groups().collect()
37 }
38 }
39 x => {
40 panic!("Cannot identify file format ({:?})", x)
41 }
42 };
43 let spectra: Vec<_> = groups
44 .iter()
45 .flat_map(|g| g.precursor.iter().chain(g.products.iter()))
46 .collect();
47 let end = Instant::now();
48 eprintln!(
49 "Read {} groups with {} spectra in {:0.3?}",
50 groups.len(),
51 spectra.len(),
52 end - start
53 );
54 assert!(!spectra.is_empty());
55 Ok(())
56}