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}