From eb428eb5373b00f966f28d6bcc8c782083076653 Mon Sep 17 00:00:00 2001 From: fluo10 Date: Fri, 20 Jun 2025 07:28:51 +0900 Subject: [PATCH] flatten global structs --- .../src/data/migration/mod.rs | 4 +- lazy-supplements-core/src/global/config.rs | 18 ++++++ .../src/global/database_connection.rs | 59 ++++++++++++------- lazy-supplements-core/src/global/mod.rs | 41 ++++++++----- .../src/global/storage_config.rs | 22 ------- lazy-supplements-core/src/p2p/mod.rs | 15 +++-- lazy-supplements-core/src/tests.rs | 2 - 7 files changed, 93 insertions(+), 68 deletions(-) create mode 100644 lazy-supplements-core/src/global/config.rs delete mode 100644 lazy-supplements-core/src/global/storage_config.rs diff --git a/lazy-supplements-core/src/data/migration/mod.rs b/lazy-supplements-core/src/data/migration/mod.rs index 3089688..f2c5ccb 100644 --- a/lazy-supplements-core/src/data/migration/mod.rs +++ b/lazy-supplements-core/src/data/migration/mod.rs @@ -3,11 +3,11 @@ use sea_orm_migration::prelude::*; pub mod m20220101_000001_create_main_tables; #[cfg(any(test, feature="test"))] -pub struct MainMigrator; +pub struct DataMigrator; #[cfg(any(test, feature="test"))] #[async_trait::async_trait] -impl MigratorTrait for MainMigrator { +impl MigratorTrait for DataMigrator { fn migrations() -> Vec> { vec![Box::new(m20220101_000001_create_main_tables::Migration)] } diff --git a/lazy-supplements-core/src/global/config.rs b/lazy-supplements-core/src/global/config.rs new file mode 100644 index 0000000..4b68e9b --- /dev/null +++ b/lazy-supplements-core/src/global/config.rs @@ -0,0 +1,18 @@ +use crate::{config::StorageConfig, error::Error}; +use tokio::sync::OnceCell; + +static STORAGE_CONFIG: OnceCell = OnceCell::const_new(); + +pub async fn get_or_init_storage_config(config: StorageConfig) -> &'static StorageConfig { + STORAGE_CONFIG.get_or_init(|| async { + config + }).await +} + +pub fn get_storage_config() -> Option<&'static StorageConfig> { + STORAGE_CONFIG.get() +} + +pub fn get_and_unwrap_storage_config() -> &'static StorageConfig { + STORAGE_CONFIG.get().expect("global storage config is uninitialized!") +} diff --git a/lazy-supplements-core/src/global/database_connection.rs b/lazy-supplements-core/src/global/database_connection.rs index 467cd2b..4eb8f8d 100644 --- a/lazy-supplements-core/src/global/database_connection.rs +++ b/lazy-supplements-core/src/global/database_connection.rs @@ -5,28 +5,43 @@ use sea_orm_migration::MigratorTrait; use crate::error::Error; use tokio::sync::OnceCell; -use super::storage_config::GlobalStorageConfig; +static DATA_DATABASE_CONNECTION: OnceCell = OnceCell::const_new(); +static CACHE_DATABASE_CONNECTION: OnceCell = OnceCell::const_new(); -static UNINITIALIZED_MESSAGE: &str = "global database connection uninitialized!"; +pub fn get_data_database_connection() -> Option<&'static DatabaseConnection> { + DATA_DATABASE_CONNECTION.get() +} +pub fn get_and_unwrap_data_database_connection() -> &'static DatabaseConnection { + get_data_database_connection().expect("global data database connection uninitialized!") +} +pub async fn get_or_try_init_data_database_connection(path: T, _: U) -> Result<&'static DatabaseConnection, Error> +where + T: AsRef, + U: MigratorTrait +{ + let url = "sqlite://".to_string() + path.as_ref().to_str().unwrap() + "?mode=rwc"; + Ok(DATA_DATABASE_CONNECTION.get_or_try_init(|| async { + let db = Database::connect(&url).await?; + U::up(&db, None).await?; + Ok::(db) + }).await?) +} -pub trait GlobalDatabaseConnection: GlobalStorageConfig { - fn get_data_database_connection_as_once_cell(&'static self) -> &'static OnceCell; - fn get_data_database_connection(&'static self) -> Option<&'static DatabaseConnection> { - self.get_data_database_connection_as_once_cell().get() - } - fn get_and_unwrap_data_database_connection(&'static self) -> &'static DatabaseConnection { - self.get_data_database_connection().expect(UNINITIALIZED_MESSAGE) - } - async fn get_or_try_init_data_database_connection(&'static self, _: T) -> Result<&DatabaseConnection, Error> - where - T: MigratorTrait - { - let url = "sqlite://".to_string() + self.get_and_unwrap_storage_config().get_data_database_path().to_str().unwrap() + "?mode=rwc"; - Ok(self.get_data_database_connection_as_once_cell().get_or_try_init(|| async { - let db = Database::connect(&url).await?; - T::up(&db, None).await?; - Ok::(db) - }).await?) - } - +pub fn get_cache_database_connection() -> Option<&'static DatabaseConnection> { + CACHE_DATABASE_CONNECTION.get() +} +pub fn get_and_unwrap_cache_database_connection() -> &'static DatabaseConnection { + CACHE_DATABASE_CONNECTION.get().expect("global data database connection uninitialized!") +} +pub async fn get_or_try_init_cache_database_connection(path: T, _: U) -> Result<&'static DatabaseConnection, Error> +where + T: AsRef, + U: MigratorTrait +{ + let url = "sqlite://".to_string() + path.as_ref().to_str().unwrap() + "?mode=rwc"; + Ok(DATA_DATABASE_CONNECTION.get_or_try_init(|| async { + let db = Database::connect(&url).await?; + U::up(&db, None).await?; + Ok::(db) + }).await?) } \ No newline at end of file diff --git a/lazy-supplements-core/src/global/mod.rs b/lazy-supplements-core/src/global/mod.rs index ce2a464..72b7152 100644 --- a/lazy-supplements-core/src/global/mod.rs +++ b/lazy-supplements-core/src/global/mod.rs @@ -9,9 +9,10 @@ use tokio::sync::{OnceCell, RwLock}; mod peers; pub use peers::GlobalPeers; -mod storage_config; +mod config; +pub use config::*; mod database_connection; -pub use database_connection::GlobalDatabaseConnection; +pub use database_connection::*; use uuid::{ContextV7, Timestamp, Uuid}; pub fn generate_uuid() -> Uuid { @@ -33,17 +34,29 @@ pub static DEFAULT_DATABASE_FILE_NAME: LazyLock = LazyLock::new(|| { PathBuf::from(String::new() + env!("CARGO_PKG_NAME") + ".sqlite") }); -#[cfg(any(test, feature="test"))] +#[cfg(test)] pub struct TestGlobal { - p2p_config: OnceCell, - storage_config: OnceCell, - data_database_connection: OnceCell, - cache_database_connection: OnceCell, + pub storage_config: &'static StorageConfig, + pub data_database_connection: &'static DatabaseConnection, + pub cache_database_connection: &'static DatabaseConnection, +} + +#[cfg(test)] +mod tests { + use crate::{cache::migration::CacheMigrator, data::migration::DataMigrator}; + + use super::*; + static TEST_DATA_DIRECTORY: LazyLock = todo!(); + static TEST_DATA_DATABASE_PATH: LazyLock = todo!(); + static TEST_CACHE_DIRECTORY: LazyLock = todo!(); + static TEST_CACHE_DATABASE_PATH: LazyLock = todo!(); + static TEST_STORAGE_CONFIG: LazyLock = todo!(); + + pub async fn get_or_try_init_test() -> TestGlobal { + TestGlobal { + storage_config: get_or_init_storage_config(StorageConfig{data_directory: TEST_DATA_DIRECTORY.clone(), cache_directory: TEST_CACHE_DIRECTORY.clone()}).await, + data_database_connection: get_or_try_init_data_database_connection(&*TEST_DATA_DATABASE_PATH, DataMigrator ).await.unwrap(), + cache_database_connection: get_or_try_init_cache_database_connection(&*TEST_CACHE_DATABASE_PATH, CacheMigrator).await.unwrap(), + } + } } -#[cfg(any(test, feature="test"))] -pub static GLOBAL: TestGlobal = TestGlobal{ - p2p_config: OnceCell::const_new(), - storage_config: OnceCell::const_new(), - data_database_connection: OnceCell::const_new(), - cache_database_connection: OnceCell::const_new(), -}; diff --git a/lazy-supplements-core/src/global/storage_config.rs b/lazy-supplements-core/src/global/storage_config.rs deleted file mode 100644 index 87c589c..0000000 --- a/lazy-supplements-core/src/global/storage_config.rs +++ /dev/null @@ -1,22 +0,0 @@ -use std::path::Path; - -use sea_orm::{ConnectOptions, Database, DbErr, DatabaseConnection}; -use sea_orm_migration::MigratorTrait; -use crate::{config::StorageConfig, error::Error}; -use tokio::sync::OnceCell; - -static UNINITIALIZED_MESSAGE: &str = "global storage is uninitialized!"; - -pub trait GlobalStorageConfig { - - fn init_storage_config(&'static self, config: StorageConfig) { - self.get_storage_config_once_cell().set(config).unwrap(); - } - fn get_storage_config_once_cell(&'static self) -> &'static OnceCell; - fn get_storage_config(&'static self) -> Option<&'static StorageConfig> { - self.get_storage_config_once_cell().get() - } - fn get_and_unwrap_storage_config(&'static self) -> &'static StorageConfig { - self.get_storage_config().expect(UNINITIALIZED_MESSAGE) - } -} \ No newline at end of file diff --git a/lazy-supplements-core/src/p2p/mod.rs b/lazy-supplements-core/src/p2p/mod.rs index 392a6de..af42f06 100644 --- a/lazy-supplements-core/src/p2p/mod.rs +++ b/lazy-supplements-core/src/p2p/mod.rs @@ -1,6 +1,6 @@ use libp2p::{ identity::Keypair, mdns, ping, swarm}; -use crate::error::Error; +use crate::{error::Error, global::GlobalPeers}; #[derive(swarm::NetworkBehaviour)] #[behaviour(to_swarm = "Event")] @@ -29,17 +29,20 @@ pub enum Event { } impl Event { - pub async fn run(self) { + pub async fn run(self, global: &T) + where + T: GlobalPeers + { match self { Self::Mdns(x) => { match x { mdns::Event::Discovered(e) => { for peer in e { - //let mut peers = crate::global::GLOBAL.write_peers().await; - //peers.insert(peer.0, peer.1); + global.write_peers().await; + peers.insert(peer.0, peer.1); } - //let peers = crate::global::GLOBAL.read_peers().await; - //println!("Peers: {peers:?}"); + let peers = global.read_peers().await; + println!("Peers: {peers:?}"); }, _ => {}, } diff --git a/lazy-supplements-core/src/tests.rs b/lazy-supplements-core/src/tests.rs index d0ed15a..9f76e44 100644 --- a/lazy-supplements-core/src/tests.rs +++ b/lazy-supplements-core/src/tests.rs @@ -20,7 +20,6 @@ pub static TEST_DATABASE_PATH: std::sync::LazyLock = std::sync::LazyLoc TEST_DIR_PATH.join("lazy-supplements.sqlite") }); -#[cfg(any(test, feature="test"))] pub fn test_cbor_serialize_deserialize(src: T) where T: DeserializeOwned + Serialize + PartialEq + std::fmt::Debug { @@ -30,7 +29,6 @@ where T: DeserializeOwned + Serialize + PartialEq + std::fmt::Debug assert_eq!(src, dst); } -#[cfg(any(test, feature="test"))] pub fn test_toml_serialize_deserialize(src: T) where T: DeserializeOwned + Serialize + PartialEq + std::fmt::Debug {