todors 0.10.7

todo app with CLI, REST & gRPC interfaces
use crate::consts;

pub use sqlx::sqlite::SqlitePool as Pool;
use sqlx::sqlite::SqlitePoolOptions;

pub use sqlx::{query, query_as, Error, FromRow};

pub async fn init_pool(conn_str: &str, max_conn: Option<u32>) -> Result<Pool, sqlx::Error> {
    let max_conn = max_conn.unwrap_or(consts::DEFAULT_DB_CONNECTION_POOL_SIZE);

    let conn = match conn_str {
        ":memory:" => get_sqlite_conn(conn_str, max_conn).await?,
        conn if conn.starts_with("sqlite://") => {
            let conn = conn.strip_prefix("sqlite://").unwrap();
            let conn_path = std::path::Path::new(conn);
            if !conn_path.exists() {
                let parent_dir = conn_path.parent().unwrap();
                std::fs::create_dir_all(parent_dir).unwrap();
                std::fs::File::create(conn).unwrap();
            }

            get_sqlite_conn(conn, max_conn).await?
        }
        _ => unimplemented!("This connection string is not supported: `{}`", conn_str),
    };

    Ok(conn)
}

async fn get_sqlite_conn(conn_str: &str, max_conn: u32) -> Result<Pool, sqlx::Error> {
    SqlitePoolOptions::new()
        .max_connections(max_conn)
        .connect(conn_str)
        .await
}

pub async fn apply_migrations(conn: &Pool) -> Result<(), sqlx::migrate::MigrateError> {
    sqlx::migrate!("./migrations/sqlite/").run(conn).await
}