Skip to main content

dm_database_driver_log/
error.rs

1use thiserror::Error;
2
3/// 解析失败的位置与原因。
4///
5/// `line_number == 0` 表示错误来自独立的解析调用,而不是文件迭代器。
6/// 错误只在失败路径保存原文,不影响正常解析路径。
7#[derive(Debug, Clone, PartialEq, Eq, Error)]
8pub enum ParseError {
9    #[error("invalid format at line {line_number}, offset {offset}: {what} | raw: {raw}")]
10    InvalidFormat {
11        raw: String,
12        line_number: u64,
13        offset: usize,
14        what: &'static str,
15    },
16    #[error("IO error: {0}")]
17    IoError(String),
18}
19
20impl ParseError {
21    #[cfg(any(feature = "jdbc", feature = "dm-provider"))]
22    pub(crate) fn invalid(offset: usize, what: &'static str) -> Self {
23        Self::InvalidFormat {
24            raw: String::new(),
25            line_number: 0,
26            offset,
27            what,
28        }
29    }
30
31    pub(crate) fn with_context(mut self, raw: &str, line_number: u64) -> Self {
32        if let Self::InvalidFormat {
33            raw: saved,
34            line_number: saved_line,
35            ..
36        } = &mut self
37        {
38            if saved.is_empty() {
39                *saved = raw.to_owned();
40            }
41            *saved_line = line_number;
42        }
43        self
44    }
45
46    pub fn line_number(&self) -> Option<u64> {
47        match self {
48            Self::InvalidFormat { line_number: 0, .. } => None,
49            Self::InvalidFormat { line_number, .. } => Some(*line_number),
50            Self::IoError(_) => None,
51        }
52    }
53
54    pub fn offset(&self) -> Option<usize> {
55        match self {
56            Self::InvalidFormat { offset, .. } => Some(*offset),
57            Self::IoError(_) => None,
58        }
59    }
60}