use nom::{ bytes::complete::tag, character::complete::{multispace0, multispace1}, IResult, }; use super::common::{parse_condition, parse_table_name}; use crate::syntax::RawQuerySyntax; pub fn parse_delete(input: &str) -> IResult<&str, RawQuerySyntax> { let (input, _) = tag("DELETE")(input)?; let (input, _) = multispace1(input)?; let (input, _) = tag("FROM")(input)?; let (input, _) = multispace1(input)?; let (input, table_name) = parse_table_name(input)?; let (input, _) = multispace0(input)?; let (input, condition) = parse_condition(input)?; Ok(( input, RawQuerySyntax::Delete(table_name.to_string(), condition), )) } #[cfg(test)] mod tests { use crate::parsing::delete::parse_delete; use crate::parsing::literal::Literal; use crate::syntax::{Condition, RawQuerySyntax}; #[test] fn test_parse_delete() { let (_, sntx) = parse_delete("DELETE FROM \"T1\" WHERE id = 1").expect("should parse"); assert!(matches!(sntx, RawQuerySyntax::Delete(_, _))) } #[test] fn test_parse_delete_with_spaces() { let (_, sntx) = parse_delete("DELETE FROM T1 WHERE id = 1").expect("should parse"); assert!(matches!(sntx, RawQuerySyntax::Delete(_, _))) } #[test] fn test_parse_delete_none() { let (_, sntx) = parse_delete("DELETE FROM games WHERE year = None").expect("should parse"); if let RawQuerySyntax::Delete(tname, Some(Condition::Eq(column_name, lit))) = sntx { assert_eq!(tname, "games".to_string()); assert_eq!(column_name, "year".to_string()); assert_eq!(lit, Literal::None) } else { panic!() } } }