use std::fmt;
use thiserror::Error;
#[derive(Debug, Error)]
pub enum RestSqlError {
#[error("parse error: {0}")]
ParseError(ParseError),
#[error("validation error: {0:?}")]
ValidationError(Vec<ValidationError>),
}
#[derive(Debug, Clone, PartialEq)]
pub struct ParseErrorAt {
pub line: usize,
pub col: usize,
pub span_len: usize,
pub snippet: String,
pub message: String,
}
impl fmt::Display for ParseErrorAt {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let caret = " ".repeat(self.col - 1) + &"^".repeat(self.span_len.max(1));
write!(
f,
"parse error at {}:{} — {}\n {}\n {}",
self.line, self.col, self.message, self.snippet, caret
)
}
}
#[derive(Debug, Error)]
pub enum ParseError {
#[error("parse error: {0}")]
Message(String),
#[error("{0}")]
At(ParseErrorAt),
}
#[derive(Debug, Error)]
pub enum ValidationError {
#[error("field '{0}' is not allowed")]
ForbiddenField(String),
#[error("operator {operator:?} requires a list argument on field '{field}'")]
ExpectedList { field: String, operator: String },
#[error("operator {operator:?} requires exactly 2 values on field '{field}'")]
BetweenArity { field: String, operator: String },
#[error("operator {operator:?} does not accept a list on field '{field}'")]
UnexpectedList { field: String, operator: String },
}