// mod.rs mod postgresql; use std::{collections::HashMap, fs}; use toml; use crate::config::Config; use async_trait::async_trait; use std::error::Error; use std::sync::Arc; #[async_trait] pub trait Databasetrait: Send + Sync { async fn connect( address: String, port: u32, user: String, password: String, dbname: String, ) -> Result> where Self: Sized; async fn query<'a>(&'a self, query: String) -> Result>, Box>; } #[derive(Clone)] pub struct Database { pub db: Arc>, } impl Database { pub fn get_db(&self) -> &Box { &self.db } } impl Database { pub async fn init() -> Result> { let config_string = fs::read_to_string("./src/config.toml") .map_err(|e| Box::new(e) as Box)?; let config: Config = toml::from_str(&config_string) .map_err(|e| Box::new(e) as Box)?; match config.database.db_type.as_str() { "postgresql" => { let db = postgresql::Postgresql::connect( config.database.address, config.database.prot, config.database.user, config.database.password, config.database.db_name, ).await?; Ok(Database { db: Arc::new(Box::new(db)) }) } _ => Err(anyhow::anyhow!("unknown database type").into()), } } }