metis_core/application/
mod.rs

1pub mod services;
2
3use crate::dal::Database;
4use crate::Result;
5use std::path::Path;
6
7/// Application layer coordinator
8/// Manages services and provides high-level application operations
9pub struct Application {
10    database: Database,
11}
12
13impl Application {
14    /// Create a new application instance
15    pub fn new(database: Database) -> Self {
16        Self { database }
17    }
18
19    /// Execute a database operation
20    pub fn with_database<F, R>(&mut self, f: F) -> R
21    where
22        F: FnOnce(&mut services::DatabaseService) -> R,
23    {
24        let repository = self
25            .database
26            .repository()
27            .expect("Failed to get database repository");
28        let mut service = services::DatabaseService::new(repository);
29        f(&mut service)
30    }
31
32    /// Execute a sync operation
33    pub fn with_sync<F, R>(&mut self, f: F) -> R
34    where
35        F: FnOnce(&mut services::SyncService) -> R,
36    {
37        let repository = self
38            .database
39            .repository()
40            .expect("Failed to get database repository");
41        let mut db_service = services::DatabaseService::new(repository);
42        let mut sync_service = services::SyncService::new(&mut db_service);
43        f(&mut sync_service)
44    }
45
46    /// Convenience method to sync a directory
47    pub async fn sync_directory<P: AsRef<Path>>(
48        self,
49        dir_path: P,
50    ) -> Result<Vec<services::synchronization::SyncResult>> {
51        let mut db_service = services::DatabaseService::new(self.database.into_repository());
52        let mut sync_service = services::SyncService::new(&mut db_service);
53        sync_service.sync_directory(dir_path).await
54    }
55
56    /// Get access to the underlying database
57    pub fn database(&mut self) -> &mut Database {
58        &mut self.database
59    }
60}