sql-schema 0.6.3

Declarative SQL schema migrations
Documentation
use thiserror::Error;

use crate::{ast, dialect, sealed::Sealed};

#[derive(Error, Debug)]
#[error("Oops, we couldn't parse that!")]
pub struct ParseError(#[from] sqlparser::parser::ParserError);

pub trait Parse: Sealed {
    fn parse_sql<'a, Dialect>(
        &self,
        sql: impl Into<&'a str>,
    ) -> Result<Vec<ast::Statement>, ParseError>;
}

fn parse_sql<'a>(
    dialect: Box<dyn sqlparser::dialect::Dialect>,
    sql: impl Into<&'a str>,
) -> Result<Vec<ast::Statement>, ParseError> {
    let tree = sqlparser::parser::Parser::parse_sql(dialect.as_ref(), sql.into())?;
    Ok(tree)
}

impl Parse for dialect::Generic {
    fn parse_sql<'a, Dialect>(
        &self,
        sql: impl Into<&'a str>,
    ) -> Result<Vec<ast::Statement>, ParseError> {
        parse_sql(Box::new(sqlparser::dialect::GenericDialect {}), sql)
    }
}

impl Parse for dialect::PostgreSQL {
    fn parse_sql<'a, Dialect>(
        &self,
        sql: impl Into<&'a str>,
    ) -> Result<Vec<ast::Statement>, ParseError> {
        parse_sql(Box::new(sqlparser::dialect::PostgreSqlDialect {}), sql)
    }
}

impl Parse for dialect::SQLite {
    fn parse_sql<'a, Dialect>(
        &self,
        sql: impl Into<&'a str>,
    ) -> Result<Vec<ast::Statement>, ParseError> {
        parse_sql(Box::new(sqlparser::dialect::SQLiteDialect {}), sql)
    }
}