1use std::fmt;
2use thiserror::Error;
3
4#[derive(Debug, Error)]
5pub enum RestSqlError {
6 #[error("parse error: {0}")]
7 ParseError(ParseError),
8 #[error("validation error: {0:?}")]
9 ValidationError(Vec<ValidationError>),
10}
11
12#[derive(Debug, Clone, PartialEq)]
22pub struct ParseErrorAt {
23 pub line: usize,
25 pub col: usize,
27 pub span_len: usize,
29 pub snippet: String,
31 pub message: String,
33}
34
35impl fmt::Display for ParseErrorAt {
36 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37 let caret = " ".repeat(self.col - 1) + &"^".repeat(self.span_len.max(1));
38 write!(
39 f,
40 "parse error at {}:{} — {}\n {}\n {}",
41 self.line, self.col, self.message, self.snippet, caret
42 )
43 }
44}
45
46#[derive(Debug, Error)]
47pub enum ParseError {
48 #[error("parse error: {0}")]
50 Message(String),
51
52 #[error("{0}")]
54 At(ParseErrorAt),
55}
56
57#[derive(Debug, Error)]
58pub enum ValidationError {
59 #[error("field '{0}' is not allowed")]
60 ForbiddenField(String),
61 #[error("operator {operator:?} requires a list argument on field '{field}'")]
62 ExpectedList { field: String, operator: String },
63 #[error("operator {operator:?} requires exactly 2 values on field '{field}'")]
64 BetweenArity { field: String, operator: String },
65 #[error("operator {operator:?} does not accept a list on field '{field}'")]
66 UnexpectedList { field: String, operator: String },
67}