Skip to main content

sql_schema/
parser.rs

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}