use crate::token::Symbol;
use serde::Serialize;
use thiserror::Error;
#[derive(Debug, Error, Serialize)]
pub enum Error {
#[error(transparent)]
Lexer(LexerError),
#[error(transparent)]
Parser(ParserError),
#[error(transparent)]
Analysis(AnalysisError),
}
#[derive(Debug, Error, Serialize)]
pub enum LexerError {
#[error("unexpected end of input")]
IncompleteInput,
#[error("{0}:{1}: invalid character")]
InvalidSymbol(u32, u32),
}
#[derive(Debug, Error, Serialize)]
pub enum ParserError {
#[error("{0}:{1}: expected identifier but got {2}")]
ExpectedIdent(u32, u32, String),
#[error("{0}:{1}: missing FROM statement")]
MissingFromStatement(u32, u32),
#[error("{0}:{1}: expected keyword {2} but got {3}")]
ExpectedKeyword(u32, u32, &'static str, String),
#[error("{0}:{1}: expected {2} but got {3}")]
ExpectedSymbol(u32, u32, Symbol, String),
#[error("{0}:{1}: unexpected token {2}")]
UnexpectedToken(u32, u32, String),
#[error("{0}:{1}: expected a type")]
ExpectedType(u32, u32),
#[error("unexpected end of file")]
UnexpectedEof,
}
#[derive(Debug, Error, Serialize)]
pub enum AnalysisError {
#[error("{0}:{1}: binding '{2}' already exists")]
BindingAlreadyExists(u32, u32, String),
#[error("{0}:{1}: variable '{2}' is undeclared")]
VariableUndeclared(u32, u32, String),
#[error("{0}:{1}: type mismatch: expected {2} but got {3} ")]
TypeMismatch(u32, u32, String, String),
#[error("{0}:{1}: record field '{2}' is undeclared ")]
FieldUndeclared(u32, u32, String),
#[error("{0}:{1}: function '{2}' is undeclared ")]
FuncUndeclared(u32, u32, String),
#[error("{0}:{1}: expected record but got {2}")]
ExpectRecord(u32, u32, String),
#[error("{0}:{1}: expected a record or a sourced-property but got {2}")]
ExpectRecordOrSourcedProperty(u32, u32, String),
#[error("{0}:{1}: expected an array but got {2}")]
ExpectArray(u32, u32, String),
#[error("{0}:{1}: expected a field")]
ExpectFieldLiteral(u32, u32),
#[error("{0}:{1}: expected a record")]
ExpectRecordLiteral(u32, u32),
#[error("{0}:{1}: unknown type '{2}'")]
UnknownType(u32, u32, String),
#[error("{0}:{1}: incorrect number of arguments supplied to function '{2}'")]
FunWrongArgumentCount(u32, u32, String),
#[error("{0}:{1}: aggregate function '{2}' can only be used in a PROJECT INTO clause")]
WrongAggFunUsage(u32, u32, String),
#[error("{0}:{1}: aggregate functions cannot be used with source-bound fields")]
UnallowedAggFuncUsageWithSrcField(u32, u32),
#[error("{0}:{1}: unexpected empty record")]
EmptyRecord(u32, u32),
#[error("{0}:{1}: aggregate functions arguments must be source-bound fields")]
ExpectSourceBoundProperty(u32, u32),
#[error("{0}:{1}: constant expressions are forbidden in PROJECT INTO clause")]
ConstantExprInProjectIntoClause(u32, u32),
#[error("{0}:{1}: expect aggregate expression")]
ExpectAggExpr(u32, u32),
}
impl From<LexerError> for Error {
fn from(value: LexerError) -> Self {
Self::Lexer(value)
}
}
impl From<ParserError> for Error {
fn from(value: ParserError) -> Self {
Self::Parser(value)
}
}
impl From<AnalysisError> for Error {
fn from(value: AnalysisError) -> Self {
Self::Analysis(value)
}
}