1use std::fmt;
9
10#[derive(Debug, Clone, PartialEq, Eq)]
16pub enum SqlWarningLevel {
17 Note,
19 Warning,
21 Error,
24}
25
26impl fmt::Display for SqlWarningLevel {
27 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
28 match self {
29 Self::Note => write!(f, "Note"),
30 Self::Warning => write!(f, "Warning"),
31 Self::Error => write!(f, "Error"),
32 }
33 }
34}
35
36#[derive(Debug, Clone, PartialEq, Eq)]
59pub struct SqlWarning {
60 pub code: u16,
62 pub level: SqlWarningLevel,
64 pub message: String,
66}
67
68impl fmt::Display for SqlWarning {
69 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
70 write!(f, "[{}] {}: {}", self.level, self.code, self.message)
71 }
72}
73
74pub fn parse_warning_level(s: &str) -> SqlWarningLevel {
81 match s.to_ascii_lowercase().as_str() {
82 "note" => SqlWarningLevel::Note,
83 "error" => SqlWarningLevel::Error,
84 _ => SqlWarningLevel::Warning,
85 }
86}
87
88#[cfg(test)]
91mod tests {
92 use super::*;
93
94 #[test]
95 fn sql_warning_display() {
96 let w = SqlWarning {
97 code: 1292,
98 level: SqlWarningLevel::Warning,
99 message: "Incorrect date value".to_string(),
100 };
101 let s = w.to_string();
102 assert!(s.contains("1292"), "code missing: {s}");
103 assert!(s.contains("Incorrect date"), "message missing: {s}");
104 assert!(s.contains("Warning"), "level missing: {s}");
105 }
106
107 #[test]
108 fn sql_warning_level_display() {
109 assert_eq!(SqlWarningLevel::Note.to_string(), "Note");
110 assert_eq!(SqlWarningLevel::Warning.to_string(), "Warning");
111 assert_eq!(SqlWarningLevel::Error.to_string(), "Error");
112 }
113
114 #[test]
115 fn parse_warning_level_variants() {
116 assert_eq!(parse_warning_level("note"), SqlWarningLevel::Note);
117 assert_eq!(parse_warning_level("Note"), SqlWarningLevel::Note);
118 assert_eq!(parse_warning_level("NOTE"), SqlWarningLevel::Note);
119 assert_eq!(parse_warning_level("warning"), SqlWarningLevel::Warning);
120 assert_eq!(parse_warning_level("Warning"), SqlWarningLevel::Warning);
121 assert_eq!(parse_warning_level("WARNING"), SqlWarningLevel::Warning);
122 assert_eq!(parse_warning_level("error"), SqlWarningLevel::Error);
123 assert_eq!(parse_warning_level("Error"), SqlWarningLevel::Error);
124 assert_eq!(parse_warning_level("ERROR"), SqlWarningLevel::Error);
125 assert_eq!(parse_warning_level("unknown"), SqlWarningLevel::Warning);
127 assert_eq!(parse_warning_level(""), SqlWarningLevel::Warning);
128 }
129
130 #[test]
131 fn sql_warning_debug_clone_eq() {
132 let w = SqlWarning {
133 code: 1000,
134 level: SqlWarningLevel::Note,
135 message: "test note".to_string(),
136 };
137 let w2 = w.clone();
138 assert_eq!(w, w2);
139 let _ = format!("{:?}", w);
141 }
142}