#[derive(Debug)]
pub enum NsError {
ParseError(String),
InvalidSlice(String),
UndefinedPrefix(crate::NodeRef, Vec<String>),
}
pub type NsResult<T> = Result<T, NsError>;
impl std::fmt::Display for NsError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
NsError::ParseError(msg) => write!(f, "NS Parse error: {msg}"),
NsError::InvalidSlice(msg) => write!(f, "NS Invalid slice: {msg}"),
NsError::UndefinedPrefix(_, prefixes) => {
write!(
f,
"NS Undefined prefix: Found {} undefined prefix{}: {}",
prefixes.len(),
if prefixes.len() == 1 { "" } else { "es" },
prefixes
.iter()
.map(|p| format!("'{p}'"))
.collect::<Vec<_>>()
.join(", ")
)
}
}
}
}
impl std::error::Error for NsError {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_display_parse_error() {
let error = NsError::ParseError("Failed to parse HTML".to_string());
let display = format!("{error}");
assert_eq!(display, "NS Parse error: Failed to parse HTML");
}
#[test]
fn test_display_invalid_slice() {
let error = NsError::InvalidSlice("Index out of bounds".to_string());
let display = format!("{error}");
assert_eq!(display, "NS Invalid slice: Index out of bounds");
}
#[test]
fn test_display_undefined_prefix() {
use crate::NodeRef;
let doc = NodeRef::new_document();
let error = NsError::UndefinedPrefix(doc, vec!["c".to_string(), "foo".to_string()]);
let display = format!("{error}");
assert_eq!(
display,
"NS Undefined prefix: Found 2 undefined prefixes: 'c', 'foo'"
);
}
#[test]
fn test_display_undefined_prefix_single() {
use crate::NodeRef;
let doc = NodeRef::new_document();
let error = NsError::UndefinedPrefix(doc, vec!["c".to_string()]);
let display = format!("{error}");
assert_eq!(
display,
"NS Undefined prefix: Found 1 undefined prefix: 'c'"
);
}
#[test]
fn test_error_trait() {
use std::error::Error;
let error = NsError::ParseError("test".to_string());
assert!(error.source().is_none());
let error = NsError::InvalidSlice("test".to_string());
assert!(error.source().is_none());
}
#[test]
fn test_debug_formatting() {
let parse_error = NsError::ParseError("test parse".to_string());
let debug = format!("{parse_error:?}");
assert!(debug.contains("ParseError"));
assert!(debug.contains("test parse"));
let slice_error = NsError::InvalidSlice("test slice".to_string());
let debug = format!("{slice_error:?}");
assert!(debug.contains("InvalidSlice"));
assert!(debug.contains("test slice"));
}
}