msn_kit/io/mzml_parser/
parser.rs1use 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 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}