feat: integrate thiserror
This commit is contained in:
parent
677fd19bec
commit
5ced11c40d
2 changed files with 15 additions and 4 deletions
|
|
@ -1,12 +1,15 @@
|
||||||
use minisql::{operation::Operation, schema::TableSchema};
|
use minisql::{operation::Operation, schema::TableSchema};
|
||||||
use nom::{branch::alt, multi::many0, IResult};
|
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}};
|
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 {
|
pub enum Error {
|
||||||
|
#[error("parsing error: {0}")]
|
||||||
ParsingError(String),
|
ParsingError(String),
|
||||||
ValidationError(ValidationError)
|
#[error("validation error: {0}")]
|
||||||
|
ValidationError(#[from] ValidationError)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn parse_statement<'a>(input: &'a str) -> IResult<&str, Operation> {
|
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())
|
Error::ParsingError(err.to_string())
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
validate_operation(&op, db_metadata).map_err(|err| Error::ValidationError(err))?;
|
validate_operation(&op, db_metadata)?;
|
||||||
Ok(op)
|
Ok(op)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,25 @@
|
||||||
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
use minisql::{operation::{ColumnSelection, Condition, InsertionValues, Operation}, schema::TableSchema, type_system::{DbType, IndexableValue, Value}};
|
use minisql::{operation::{ColumnSelection, Condition, InsertionValues, Operation}, schema::TableSchema, type_system::{DbType, IndexableValue, Value}};
|
||||||
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Error)]
|
||||||
pub enum ValidationError {
|
pub enum ValidationError {
|
||||||
|
#[error("table {0} does not exist")]
|
||||||
TableDoesNotExist(String),
|
TableDoesNotExist(String),
|
||||||
|
#[error("table {0} already exists")]
|
||||||
TableExists(String),
|
TableExists(String),
|
||||||
|
#[error("column {0} does not exist")]
|
||||||
ColumnDoesNotExist(String),
|
ColumnDoesNotExist(String),
|
||||||
|
#[error("bad column position {0}")]
|
||||||
BadColumnPosition(usize),
|
BadColumnPosition(usize),
|
||||||
|
#[error("duplicate column {0}")]
|
||||||
DuplicateColumn(String),
|
DuplicateColumn(String),
|
||||||
|
#[error("type mismatch")]
|
||||||
TypeMismatch,
|
TypeMismatch,
|
||||||
|
#[error("value for required column {0} is missing")]
|
||||||
ValueForRequiredColumnIsMissing(String)
|
ValueForRequiredColumnIsMissing(String)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue