dm_database_parser_sqllog/
error.rs

1use std::error::Error;
2use std::fmt;
3use std::num::{ParseFloatError, ParseIntError};
4
5/// 解析错误类型
6///
7/// 说明:该枚举表示在将日志字段从字符串解析为数字或其他期望格式时可能发生的错误。
8/// 我们把常见的错误包装成特定变体,便于上层调用者进行匹配、报告或恢复处理。
9/// - `MissingFields(usize)`:当解析时发现字段数量不足(例如缺少期望的元数据项)时使用;携带期望字段数用于诊断;
10/// - `Int(ParseIntError)`:整数解析失败的包装(保留原始 ParseIntError 以便追踪来源);
11/// - `Float(ParseFloatError)`:浮点数解析失败的包装;
12/// - `InvalidFormat`:通用格式错误,用于无法归类或发现奇怪格式时的占位错误。
13#[derive(Debug)]
14pub enum ParseError {
15    MissingFields(usize),
16    Int(ParseIntError),
17    Float(ParseFloatError),
18    InvalidFormat,
19}
20
21impl fmt::Display for ParseError {
22    /// 为 ParseError 提供可读的错误信息,方便在日志或用户界面中直接打印。
23    ///
24    /// 目的:实现 Display 可以让错误在使用 `eprintln!`、`format!` 或 `println!` 时显示更友好的文本。
25    /// 同时,Display 不丢弃底层错误的信息;`Error::source()` 会指向原始的解析错误(若有),以便链式错误追踪。
26    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
27        match self {
28            ParseError::MissingFields(n) => write!(f, "missing fields: expected {} fields", n),
29            ParseError::Int(e) => write!(f, "int parse error: {}", e),
30            ParseError::Float(e) => write!(f, "float parse error: {}", e),
31            ParseError::InvalidFormat => write!(f, "invalid format"),
32        }
33    }
34}
35
36impl Error for ParseError {
37    /// 返回底层错误以支持错误链(`source`),这对于调试和日志记录很有用。
38    /// 例如,当 `ParseIntError` 发生时,`source()` 会返回原始的 `ParseIntError`,调用方可以通过它获取更多上下文。
39    fn source(&self) -> Option<&(dyn Error + 'static)> {
40        match self {
41            ParseError::Int(e) => Some(e),
42            ParseError::Float(e) => Some(e),
43            _ => None,
44        }
45    }
46}
47
48/// 为方便使用 `?` 操作符,将标准库的解析错误转换为 `ParseError`。
49///
50/// 解释:实现 `From<ParseIntError>` / `From<ParseFloatError>` 能让在解析整数/浮点数时直接使用 `?`,
51/// 并自动将底层错误转换为本 crate 的统一错误类型,简化上层错误传播逻辑。
52impl From<ParseIntError> for ParseError {
53    fn from(e: ParseIntError) -> Self {
54        ParseError::Int(e)
55    }
56}
57
58impl From<ParseFloatError> for ParseError {
59    fn from(e: ParseFloatError) -> Self {
60        ParseError::Float(e)
61    }
62}