drizzle 0.2.1

A type-safe SQL query builder for Rust
Documentation
use drizzle_core::error::Result;
use drizzle_migrations::{MigrateOutcome, Migration, Tracking};

use super::{Conn, execute_request, initialize_session, query_request};
use crate::builder::mysql::migration::{Effect, Session, Step};

pub(super) struct Runner<'a> {
    connection: &'a mut Conn,
    session: Session,
}

impl<'a> Runner<'a> {
    pub(super) fn new(
        connection: &'a mut Conn,
        migrations: &[Migration],
        tracking: Tracking,
    ) -> Self {
        Self {
            connection,
            session: Session::new(migrations, tracking),
        }
    }

    pub(super) async fn run(mut self) -> Result<MigrateOutcome> {
        let mut step = self.session.start();
        loop {
            let effect = match step {
                Step::Run(effect) => effect,
                Step::Done(result) => return result,
            };
            let result = match effect {
                Effect::Initialize => initialize_session(self.connection)
                    .await
                    .map(|()| Vec::new()),
                Effect::Execute(sql) => execute_request(self.connection, &sql, &[])
                    .await
                    .map(|_| Vec::new()),
                Effect::Query(sql) => query_request(self.connection, &sql, &[]).await,
            };
            step = self.session.resume(result);
        }
    }
}