use std::fmt;
use std::io;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
InvalidUrl(String),
UrlTooLong(String),
TooManyUrls(usize),
SizeExceeded(usize),
InvalidDate(String),
InvalidPriority(f32),
InvalidChangeFreq(String),
Io(io::Error),
Xml(String),
Compression(String),
Validation(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::InvalidUrl(url) => write!(f, "Invalid URL: {}", url),
Error::UrlTooLong(url) => write!(f, "URL too long (max 2048 chars): {}", url),
Error::TooManyUrls(count) => write!(f, "Too many URLs in sitemap (max 50,000): {}", count),
Error::SizeExceeded(size) => write!(f, "Sitemap size exceeds 50MB: {} bytes", size),
Error::InvalidDate(date) => write!(f, "Invalid date format: {}", date),
Error::InvalidPriority(priority) => write!(f, "Invalid priority (must be 0.0-1.0): {}", priority),
Error::InvalidChangeFreq(freq) => write!(f, "Invalid changefreq: {}", freq),
Error::Io(err) => write!(f, "IO error: {}", err),
Error::Xml(msg) => write!(f, "XML error: {}", msg),
Error::Compression(msg) => write!(f, "Compression error: {}", msg),
Error::Validation(msg) => write!(f, "Validation error: {}", msg),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(err) => Some(err),
_ => None,
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Self {
Error::Io(err)
}
}
impl From<quick_xml::Error> for Error {
fn from(err: quick_xml::Error) -> Self {
Error::Xml(err.to_string())
}
}