use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum SqlWarningLevel {
Note,
Warning,
Error,
}
impl fmt::Display for SqlWarningLevel {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Note => write!(f, "Note"),
Self::Warning => write!(f, "Warning"),
Self::Error => write!(f, "Error"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SqlWarning {
pub code: u16,
pub level: SqlWarningLevel,
pub message: String,
}
impl fmt::Display for SqlWarning {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "[{}] {}: {}", self.level, self.code, self.message)
}
}
pub fn parse_warning_level(s: &str) -> SqlWarningLevel {
match s.to_ascii_lowercase().as_str() {
"note" => SqlWarningLevel::Note,
"error" => SqlWarningLevel::Error,
_ => SqlWarningLevel::Warning,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sql_warning_display() {
let w = SqlWarning {
code: 1292,
level: SqlWarningLevel::Warning,
message: "Incorrect date value".to_string(),
};
let s = w.to_string();
assert!(s.contains("1292"), "code missing: {s}");
assert!(s.contains("Incorrect date"), "message missing: {s}");
assert!(s.contains("Warning"), "level missing: {s}");
}
#[test]
fn sql_warning_level_display() {
assert_eq!(SqlWarningLevel::Note.to_string(), "Note");
assert_eq!(SqlWarningLevel::Warning.to_string(), "Warning");
assert_eq!(SqlWarningLevel::Error.to_string(), "Error");
}
#[test]
fn parse_warning_level_variants() {
assert_eq!(parse_warning_level("note"), SqlWarningLevel::Note);
assert_eq!(parse_warning_level("Note"), SqlWarningLevel::Note);
assert_eq!(parse_warning_level("NOTE"), SqlWarningLevel::Note);
assert_eq!(parse_warning_level("warning"), SqlWarningLevel::Warning);
assert_eq!(parse_warning_level("Warning"), SqlWarningLevel::Warning);
assert_eq!(parse_warning_level("WARNING"), SqlWarningLevel::Warning);
assert_eq!(parse_warning_level("error"), SqlWarningLevel::Error);
assert_eq!(parse_warning_level("Error"), SqlWarningLevel::Error);
assert_eq!(parse_warning_level("ERROR"), SqlWarningLevel::Error);
assert_eq!(parse_warning_level("unknown"), SqlWarningLevel::Warning);
assert_eq!(parse_warning_level(""), SqlWarningLevel::Warning);
}
#[test]
fn sql_warning_debug_clone_eq() {
let w = SqlWarning {
code: 1000,
level: SqlWarningLevel::Note,
message: "test note".to_string(),
};
let w2 = w.clone();
assert_eq!(w, w2);
let _ = format!("{:?}", w);
}
}