use minisql::{operation::Operation, schema::TableSchema}; use nom::{branch::alt, multi::many0, IResult}; use crate::{create::parse_create, delete::parse_delete, index::parse_create_index, insert::parse_insert, select::parse_select, validation::{validate_operation, ValidationError}}; #[derive(Debug)] pub enum Error { ParsingError(String), ValidationError(ValidationError) } pub fn parse_statement<'a>(input: &'a str) -> IResult<&str, Operation> { alt(( parse_insert, parse_create, parse_delete, //parse_drop, parse_select, // parse_update, parse_create_index ))(input) } pub fn parse_statements<'a>(input: &'a str) -> IResult<&str, Vec> { many0(parse_statement)(input) } pub fn parse_and_validate(query: String, db_metadata: &Vec<(String, &TableSchema)>) -> Result { let (_, op) = parse_statement(query.as_str()) .map_err(|err| { Error::ParsingError(err.to_string()) })?; validate_operation(&op, db_metadata).map_err(|err| Error::ValidationError(err))?; Ok(op) } // #[test] // fn test_select() { // parse_and_validate("SELECT * FROM users;".to_string(), &Vec::new()).unwrap(); // }