use axum::extract::FromRef; use sqlx::sqlite::SqlitePool; #[cfg(test)] use crate::user::app::Users; use crate::{ boot::app::Boot, conversation::app::Conversations, event::{self, app::Events}, invite::app::Invites, login::app::Logins, message::app::Messages, setup::app::Setup, token::{self, app::Tokens}, }; #[derive(Clone)] pub struct App { db: SqlitePool, events: event::Broadcaster, token_events: token::Broadcaster, } impl App { pub fn from(db: SqlitePool) -> Self { let events = event::Broadcaster::default(); let token_events = token::Broadcaster::default(); Self { db, events, token_events, } } } impl App { pub fn boot(&self) -> Boot { Boot::new(self.db.clone()) } pub fn conversations(&self) -> Conversations { Conversations::new(self.db.clone(), self.events.clone()) } pub fn events(&self) -> Events { Events::new(self.db.clone(), self.events.clone()) } pub fn invites(&self) -> Invites { Invites::new(self.db.clone(), self.events.clone()) } pub const fn logins(&self) -> Logins<'_> { Logins::new(&self.db, &self.token_events) } pub const fn messages(&self) -> Messages<'_> { Messages::new(&self.db, &self.events) } pub const fn setup(&self) -> Setup<'_> { Setup::new(&self.db, &self.events) } pub const fn tokens(&self) -> Tokens<'_> { Tokens::new(&self.db, &self.token_events) } #[cfg(test)] pub const fn users(&self) -> Users<'_> { Users::new(&self.db, &self.events) } } impl FromRef for Boot { fn from_ref(app: &App) -> Self { app.boot() } } impl FromRef for Conversations { fn from_ref(app: &App) -> Self { app.conversations() } } impl FromRef for Invites { fn from_ref(app: &App) -> Self { app.invites() } }