1use thiserror::Error;
2
3use crate::{ast, dialect, sealed::Sealed};
4
5#[derive(Error, Debug)]
6#[error("Oops, we couldn't parse that!")]
7pub struct ParseError(#[from] sqlparser::parser::ParserError);
8
9pub trait Parse: Sealed {
10 fn parse_sql<'a, Dialect>(
11 &self,
12 sql: impl Into<&'a str>,
13 ) -> Result<Vec<ast::Statement>, ParseError>;
14}
15
16fn parse_sql<'a>(
17 dialect: Box<dyn sqlparser::dialect::Dialect>,
18 sql: impl Into<&'a str>,
19) -> Result<Vec<ast::Statement>, ParseError> {
20 let tree = sqlparser::parser::Parser::parse_sql(dialect.as_ref(), sql.into())?;
21 Ok(tree)
22}
23
24impl Parse for dialect::Generic {
25 fn parse_sql<'a, Dialect>(
26 &self,
27 sql: impl Into<&'a str>,
28 ) -> Result<Vec<ast::Statement>, ParseError> {
29 parse_sql(Box::new(sqlparser::dialect::GenericDialect {}), sql)
30 }
31}
32
33impl Parse for dialect::PostgreSQL {
34 fn parse_sql<'a, Dialect>(
35 &self,
36 sql: impl Into<&'a str>,
37 ) -> Result<Vec<ast::Statement>, ParseError> {
38 parse_sql(Box::new(sqlparser::dialect::PostgreSqlDialect {}), sql)
39 }
40}
41
42impl Parse for dialect::SQLite {
43 fn parse_sql<'a, Dialect>(
44 &self,
45 sql: impl Into<&'a str>,
46 ) -> Result<Vec<ast::Statement>, ParseError> {
47 parse_sql(Box::new(sqlparser::dialect::SQLiteDialect {}), sql)
48 }
49}