use cssparser::{BasicParseErrorKind, ParseErrorKind};
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum ParseError {
#[error("CSS syntax error at line {line}, col {column}: {message}")]
Syntax {
line: u32,
column: u32,
message: String,
},
}
impl<'i> From<cssparser::ParseError<'i, ParseErrorOwned>> for ParseError {
fn from(err: cssparser::ParseError<'i, ParseErrorOwned>) -> Self {
let location = err.location;
let message = match err.kind {
ParseErrorKind::Basic(BasicParseErrorKind::UnexpectedToken(t)) => {
format!("unexpected token: {t:?}")
}
ParseErrorKind::Basic(BasicParseErrorKind::EndOfInput) => {
"unexpected end of input".to_string()
}
ParseErrorKind::Basic(BasicParseErrorKind::AtRuleInvalid(s)) => {
format!("invalid @-rule: {s}")
}
ParseErrorKind::Basic(BasicParseErrorKind::AtRuleBodyInvalid) => {
"invalid @-rule body".to_string()
}
ParseErrorKind::Basic(BasicParseErrorKind::QualifiedRuleInvalid) => {
"invalid rule".to_string()
}
ParseErrorKind::Custom(c) => c.0,
};
Self::Syntax {
line: location.line,
column: location.column,
message,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct ParseErrorOwned(pub String);