use color_eyre::eyre::Result; use sqlx::{Connection, SqliteConnection}; #[derive(Debug)] pub struct Model { pub items: Vec, pub db: SqliteConnection, } // impl Modeling for Model { // type Item = T; // fn add_item(&mut self, item: Self::Item) -> Result<()> { // self.items.push(item); // Ok(()) // } // fn add_to_db(&mut self, item: Self::Item) -> Result<()> { // todo!() // } // fn update_item(&mut self, item: Self::Item, index: i32) -> Result<()> { // todo!() // } // fn remove_item(&mut self, index: i32) -> Result<()> { // todo!() // } // fn get_item(&self, index: i32) -> Option<&Self::Item> { // todo!() // } // fn insert_item(&mut self, item: Self::Item, index: i32) -> Result<()> { // todo!() // } // } impl Default for Model { fn default() -> Self { Self { items: vec![], db: { let rt = tokio::runtime::Runtime::new().unwrap(); let mut data = dirs::data_local_dir().unwrap(); data.push("lumina"); data.push("library-db.sqlite3"); let mut db_url = String::from("sqlite://"); db_url.push_str(data.to_str().unwrap()); rt.block_on(async { SqliteConnection::connect(&db_url) .await .expect("problems") }) }, } } } pub trait Modeling { type Item; fn setup_db() -> SqliteConnection { let rt = tokio::runtime::Runtime::new().unwrap(); let mut data = dirs::data_local_dir().unwrap(); data.push("lumina"); data.push("library-db.sqlite3"); let mut db_url = String::from("sqlite://"); db_url.push_str(data.to_str().unwrap()); rt.block_on(async { SqliteConnection::connect(&db_url) .await .expect("problems") }) } fn add_item(&mut self, item: Self::Item) -> Result<()>; fn add_to_db(&mut self, item: Self::Item) -> Result<()>; fn update_item( &mut self, item: Self::Item, index: i32, ) -> Result<()>; fn remove_item(&mut self, index: i32) -> Result<()>; fn get_item(&self, index: i32) -> Option<&Self::Item>; fn insert_item( &mut self, item: Self::Item, index: i32, ) -> Result<()>; } #[cfg(test)] mod test { use super::*; }