diff --git a/parser/src/core.rs b/parser/src/core.rs index 1f97797..248c5c6 100644 --- a/parser/src/core.rs +++ b/parser/src/core.rs @@ -1,12 +1,15 @@ use minisql::{operation::Operation, schema::TableSchema}; use nom::{branch::alt, multi::many0, IResult}; +use thiserror::Error; use crate::{parsing::{create::parse_create, delete::parse_delete, index::parse_create_index, insert::parse_insert, select::parse_select}, validation::{validate_operation, ValidationError}}; -#[derive(Debug)] +#[derive(Debug, Error)] pub enum Error { + #[error("parsing error: {0}")] ParsingError(String), - ValidationError(ValidationError) + #[error("validation error: {0}")] + ValidationError(#[from] ValidationError) } pub fn parse_statement<'a>(input: &'a str) -> IResult<&str, Operation> { @@ -31,7 +34,7 @@ pub fn parse_and_validate(query: String, db_metadata: &Vec<(String, &TableSchema Error::ParsingError(err.to_string()) })?; - validate_operation(&op, db_metadata).map_err(|err| Error::ValidationError(err))?; + validate_operation(&op, db_metadata)?; Ok(op) } diff --git a/parser/src/validation.rs b/parser/src/validation.rs index 2be6dce..795e04f 100644 --- a/parser/src/validation.rs +++ b/parser/src/validation.rs @@ -1,17 +1,25 @@ use std::collections::HashSet; +use thiserror::Error; use minisql::{operation::{ColumnSelection, Condition, InsertionValues, Operation}, schema::TableSchema, type_system::{DbType, IndexableValue, Value}}; -#[derive(Debug)] +#[derive(Debug, Error)] pub enum ValidationError { + #[error("table {0} does not exist")] TableDoesNotExist(String), + #[error("table {0} already exists")] TableExists(String), + #[error("column {0} does not exist")] ColumnDoesNotExist(String), + #[error("bad column position {0}")] BadColumnPosition(usize), + #[error("duplicate column {0}")] DuplicateColumn(String), + #[error("type mismatch")] TypeMismatch, + #[error("value for required column {0} is missing")] ValueForRequiredColumnIsMissing(String) }