//! Storage and persistence logic. use std::str::FromStr; use serde::Deserialize; use sqlx::sqlite::SqliteConnectOptions; use sqlx::{ConnectOptions, SqliteConnection}; use crate::prelude::*; #[derive(Deserialize, Debug, Clone)] pub struct StorageConfig { pub db_path: String, } pub struct Storage { conn: SqliteConnection, } impl Storage { pub async fn open(config: StorageConfig) -> Result { let opts = SqliteConnectOptions::from_str(&*config.db_path)?.create_if_missing(true); let mut conn = opts.connect().await?; let migrator = sqlx::migrate!(); migrator.run(&mut conn).await?; log::info!("Migrations passed"); Ok(Storage { conn }) } }