bgpkit_parser/parser/iters/
default.rs1use crate::error::ParserError;
5use crate::models::*;
6use crate::parser::BgpkitParser;
7use crate::{Elementor, Filterable};
8use log::{error, warn};
9use std::io::Read;
10
11pub struct RecordIterator<R> {
16 pub parser: BgpkitParser<R>,
17 pub count: u64,
18 elementor: Elementor,
19}
20
21impl<R> RecordIterator<R> {
22 pub(crate) fn new(parser: BgpkitParser<R>) -> Self {
23 RecordIterator {
24 parser,
25 count: 0,
26 elementor: Elementor::new(),
27 }
28 }
29}
30
31impl<R: Read> Iterator for RecordIterator<R> {
32 type Item = MrtRecord;
33
34 fn next(&mut self) -> Option<MrtRecord> {
35 self.count += 1;
36 loop {
37 return match self.parser.next_record() {
38 Ok(v) => {
39 let filters = &self.parser.filters;
41 if filters.is_empty() {
42 Some(v)
43 } else {
44 if let MrtMessage::TableDumpV2Message(TableDumpV2Message::PeerIndexTable(
45 _,
46 )) = &v.message
47 {
48 let _ = self.elementor.record_to_elems(v.clone());
49 return Some(v);
50 }
51 let elems = self.elementor.record_to_elems(v.clone());
52 if elems.iter().any(|e| e.match_filters(&self.parser.filters)) {
53 Some(v)
54 } else {
55 continue;
56 }
57 }
58 }
59 Err(e) => {
60 match e.error {
61 ParserError::TruncatedMsg(err_str) | ParserError::Unsupported(err_str) => {
62 if self.parser.options.show_warnings {
63 warn!("parser warn: {}", err_str);
64 }
65 if let Some(bytes) = e.bytes {
66 std::fs::write("mrt_core_dump", bytes)
67 .expect("Unable to write to mrt_core_dump");
68 }
69 continue;
70 }
71 ParserError::ParseError(err_str) => {
72 error!("parser error: {}", err_str);
73 if self.parser.core_dump {
74 if let Some(bytes) = e.bytes {
75 std::fs::write("mrt_core_dump", bytes)
76 .expect("Unable to write to mrt_core_dump");
77 }
78 None
79 } else {
80 continue;
81 }
82 }
83 ParserError::EofExpected => {
84 None
86 }
87 ParserError::IoError(err) | ParserError::EofError(err) => {
88 error!("{:?}", err);
90 if self.parser.core_dump {
91 if let Some(bytes) = e.bytes {
92 std::fs::write("mrt_core_dump", bytes)
93 .expect("Unable to write to mrt_core_dump");
94 }
95 }
96 None
97 }
98 #[cfg(feature = "oneio")]
99 ParserError::OneIoError(_) => None,
100 ParserError::FilterError(_) => {
101 None
103 }
104 }
105 }
106 };
107 }
108 }
109}
110
111pub struct ElemIterator<R> {
116 cache_elems: Vec<BgpElem>,
117 record_iter: RecordIterator<R>,
118 elementor: Elementor,
119 count: u64,
120}
121
122impl<R> ElemIterator<R> {
123 pub(crate) fn new(parser: BgpkitParser<R>) -> Self {
124 ElemIterator {
125 record_iter: RecordIterator::new(parser),
126 count: 0,
127 cache_elems: vec![],
128 elementor: Elementor::new(),
129 }
130 }
131}
132
133impl<R: Read> Iterator for ElemIterator<R> {
134 type Item = BgpElem;
135
136 fn next(&mut self) -> Option<BgpElem> {
137 self.count += 1;
138
139 loop {
140 if self.cache_elems.is_empty() {
141 loop {
143 match self.record_iter.next() {
144 None => {
145 return None;
147 }
148 Some(r) => {
149 let mut elems = self.elementor.record_to_elems(r);
150 if elems.is_empty() {
151 continue;
153 } else {
154 elems.reverse();
155 self.cache_elems = elems;
156 break;
157 }
158 }
159 }
160 }
161 }
163
164 let elem = self.cache_elems.pop();
167 match elem {
168 None => return None,
169 Some(e) => match e.match_filters(&self.record_iter.parser.filters) {
170 true => return Some(e),
171 false => continue,
172 },
173 }
174 }
175 }
176}