Skip to main content

br_pgsql/
error.rs

1use std::fmt;
2use std::io;
3
4#[derive(Debug)]
5pub enum PgsqlError {
6    Connection(String),
7    Io(io::Error),
8    Timeout(String),
9    Protocol(String),
10    Auth(String),
11    Query {
12        code: String,
13        message: String,
14        detail: String,
15        sql: String,
16        position: u16,
17    },
18    Pool(String),
19}
20
21impl fmt::Display for PgsqlError {
22    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
23        match self {
24            PgsqlError::Connection(msg) => write!(f, "连接错误: {}", msg),
25            PgsqlError::Io(err) => write!(f, "IO错误: {}", err),
26            PgsqlError::Timeout(msg) => write!(f, "超时: {}", msg),
27            PgsqlError::Protocol(msg) => write!(f, "协议错误: {}", msg),
28            PgsqlError::Auth(msg) => write!(f, "认证失败: {}", msg),
29            PgsqlError::Query {
30                code,
31                message,
32                detail,
33                sql,
34                position,
35            } => {
36                write!(
37                    f,
38                    "Code: {} ErrorMsg[line:{}]: {} detail: {} SQL: {}",
39                    code, position, message, detail, sql
40                )
41            }
42            PgsqlError::Pool(msg) => write!(f, "连接池错误: {}", msg),
43        }
44    }
45}
46
47impl std::error::Error for PgsqlError {
48    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
49        match self {
50            PgsqlError::Io(err) => Some(err),
51            _ => None,
52        }
53    }
54}
55
56impl From<io::Error> for PgsqlError {
57    fn from(err: io::Error) -> Self {
58        PgsqlError::Io(err)
59    }
60}
61
62impl From<String> for PgsqlError {
63    fn from(s: String) -> Self {
64        PgsqlError::Protocol(s)
65    }
66}
67
68impl From<&str> for PgsqlError {
69    fn from(s: &str) -> Self {
70        PgsqlError::Protocol(s.to_string())
71    }
72}
73
74impl From<PgsqlError> for String {
75    fn from(err: PgsqlError) -> Self {
76        err.to_string()
77    }
78}