msn_kit/io/mzml_parser/
parser.rs

1// (c) Copyright 2021 Trent Hauck
2// All Rights Reserved
3
4use quick_xml;
5use quick_xml::events::Event;
6
7use std::io::BufRead;
8use std::io::Cursor;
9
10use crate::io::mzml_parser::types;
11
12pub struct MzMLReader<R: BufRead> {
13    reader: quick_xml::Reader<R>,
14}
15
16impl<R> MzMLReader<R>
17where
18    R: BufRead,
19{
20    // new creates a new MzMLReader from an quick_xml::Reader
21    pub fn new(reader: quick_xml::Reader<R>) -> Self {
22        Self { reader }
23    }
24
25    pub fn from_reader(buf_reader: R) -> Self {
26        let mut xml_reader = quick_xml::Reader::from_reader(buf_reader);
27        xml_reader.trim_text(false);
28
29        Self::new(xml_reader)
30    }
31
32    pub fn read_spectrum(&mut self) -> std::io::Result<types::Spectrum> {
33        let mut buf = Vec::new();
34
35        loop {
36            match self.reader.read_event(&mut buf) {
37                Ok(Event::Start(e)) if e.name() != b"spectrum" => {
38                    continue;
39                }
40                Ok(Event::Start(e)) => {
41                    let end = b"spectrum";
42
43                    let mut buf3 = Vec::new();
44                    let mut writer = quick_xml::Writer::new(Cursor::new(&mut buf3));
45
46                    writer.write_event(Event::Start(e)).unwrap();
47
48                    loop {
49                        match self.reader.read_event(&mut buf) {
50                            Ok(Event::Start(e)) => {
51                                writer.write_event(Event::Start(e)).unwrap();
52                            }
53                            Ok(Event::Empty(e)) => {
54                                writer.write_event(Event::Empty(e)).unwrap();
55                            }
56                            Ok(Event::Text(e)) => {
57                                writer.write_event(Event::Text(e)).unwrap();
58                            }
59                            Ok(Event::End(e)) => {
60                                if e.name() == end {
61                                    writer.write_event(Event::End(e)).unwrap();
62                                    break;
63                                } else {
64                                    writer.write_event(Event::End(e)).unwrap();
65                                }
66                            }
67                            Ok(Event::Eof) => {
68                                return Err(std::io::Error::new(
69                                    std::io::ErrorKind::Other,
70                                    "Unexpected Eof Event",
71                                ))
72                            }
73                            Err(_) => panic!("fuck"),
74                            Ok(e) => panic!("event: {:?}", e),
75                        }
76                    }
77
78                    let c = Cursor::new(buf3);
79                    let spectrum: types::Spectrum = quick_xml::de::from_reader(c).unwrap();
80                    return Ok(spectrum);
81                }
82                Ok(Event::Eof) => {
83                    return Err(std::io::Error::new(
84                        std::io::ErrorKind::Other,
85                        "Unexpected Eof Event",
86                    ))
87                }
88                Err(e) => println!("{:?}", e),
89                _ => {
90                    buf.clear();
91                }
92            }
93        }
94    }
95}
96
97#[cfg(test)]
98mod tests {
99    use super::*;
100
101    use std::fs::File;
102    use std::io::BufReader;
103    use std::path::PathBuf;
104
105    #[test]
106    fn reader_test() -> Result<(), String> {
107        let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR"));
108        d.push("resources/test/test.mzml.xml");
109
110        let file = File::open(d).expect("Couldn't open test file.");
111        let buf_reader = BufReader::new(file);
112
113        let mut xml_reader = quick_xml::Reader::from_reader(buf_reader);
114        xml_reader.trim_text(false);
115
116        let mut mzml_reader = MzMLReader::new(xml_reader);
117
118        let spectrum = mzml_reader.read_spectrum();
119        assert!(spectrum.is_ok());
120
121        let spectrum = spectrum.unwrap();
122
123        let data = spectrum.binary_data_array_list.binary_data_array[0]
124            .binary_array_to_vector()
125            .unwrap();
126
127        let expected = vec![
128            0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, 13.0, 14.0,
129        ];
130
131        assert_eq!(expected, data);
132
133        Ok(())
134    }
135}