dm_database_parser_sqllog/parser/
sqllog_parser.rs

1//! SqllogParser - 将 RecordParser 转换为 Sqllog 迭代器
2//!
3//! 提供了一个适配器,将原始的 `Record` 流转换为解析后的 `Sqllog` 流。
4
5use crate::error::ParseError;
6use crate::parser::record_parser::RecordParser;
7use crate::sqllog::Sqllog;
8use std::io::Read;
9
10/// 将 RecordParser 转换为 Sqllog 迭代器的适配器
11///
12/// `SqllogParser` 在 `RecordParser` 的基础上,自动将每个 `Record` 解析为 `Sqllog`。
13///
14/// # 类型参数
15///
16/// * `R` - 实现了 `Read` trait 的类型
17///
18/// # 示例
19///
20/// ```no_run
21/// use dm_database_parser_sqllog::SqllogParser;
22/// use std::fs::File;
23///
24/// let file = File::open("sqllog.txt").unwrap();
25/// let parser = SqllogParser::new(file);
26///
27/// for result in parser {
28///     match result {
29///         Ok(sqllog) => println!("SQL: {}", sqllog.body),
30///         Err(e) => eprintln!("解析错误: {}", e),
31///     }
32/// }
33/// ```
34pub struct SqllogParser<R: Read> {
35    record_parser: RecordParser<R>,
36}
37
38impl<R: Read> SqllogParser<R> {
39    /// 创建新的 SqllogParser
40    ///
41    /// # 参数
42    ///
43    /// * `reader` - 任何实现了 `Read` trait 的类型
44    ///
45    /// # 返回
46    ///
47    /// 返回一个新的 `SqllogParser` 实例
48    pub fn new(reader: R) -> Self {
49        Self {
50            record_parser: RecordParser::new(reader),
51        }
52    }
53}
54
55impl<R: Read> Iterator for SqllogParser<R> {
56    type Item = Result<Sqllog, ParseError>;
57
58    fn next(&mut self) -> Option<Self::Item> {
59        match self.record_parser.next()? {
60            Ok(record) => Some(record.parse_to_sqllog()),
61            Err(e) => Some(Err(ParseError::FileNotFound {
62                path: e.to_string(),
63            })),
64        }
65    }
66}