use origin_accounts::AccountService;
use origin_connector::ConnectorRegistry;
use origin_domain::{AppError, Clock, Result};
use origin_events::EventBus;
use origin_http::HttpClient;
use origin_jobs::Jobs;
use origin_platform::{
ConfirmationService, GlobalShortcutService, NotificationService, Opener, ProcessRunner,
TrayService, WorkspaceFs, WorkspaceWatcher,
};
use origin_secrets::SecretStore;
use origin_settings::Settings;
use origin_storage::{Cache, Storage};
use origin_sync::SyncEngine;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct Platform {
pub clock: Arc<dyn Clock>,
pub events: EventBus,
pub storage: Arc<dyn Storage>,
pub cache: Cache,
pub secrets: Arc<dyn SecretStore>,
pub settings: Settings,
pub notifications: Arc<dyn NotificationService>,
pub confirmation: Arc<dyn ConfirmationService>,
pub tray: Option<Arc<dyn TrayService>>,
pub jobs: Jobs,
pub sync: SyncEngine,
pub accounts: AccountService,
pub connectors: ConnectorRegistry,
pub opener: Option<Arc<dyn Opener>>,
pub http: Option<Arc<dyn HttpClient>>,
pub workspace_fs: Option<Arc<dyn WorkspaceFs>>,
pub workspace_watcher: Option<Arc<dyn WorkspaceWatcher>>,
pub process_runner: Option<Arc<dyn ProcessRunner>>,
pub global_shortcuts: Option<Arc<dyn GlobalShortcutService>>,
}
impl Platform {
pub fn http(&self) -> Result<Arc<dyn HttpClient>> {
self.http.clone().ok_or_else(|| {
AppError::configuration(
"this application has no http client — add `.http_client(...)` to its \
composition root",
)
})
}
pub fn opener(&self) -> Result<Arc<dyn Opener>> {
self.opener.clone().ok_or_else(|| {
AppError::Permission("this application cannot open external urls".to_owned())
})
}
pub fn workspace_fs(&self) -> Result<Arc<dyn WorkspaceFs>> {
self.workspace_fs.clone().ok_or_else(|| {
AppError::configuration(
"this application has no workspace filesystem — add `.workspace_fs(...)` to its \
composition root",
)
})
}
pub fn workspace_watcher(&self) -> Result<Arc<dyn WorkspaceWatcher>> {
self.workspace_watcher.clone().ok_or_else(|| {
AppError::configuration(
"this application has no workspace watcher — add `.workspace_watcher(...)` to its \
composition root",
)
})
}
pub fn process_runner(&self) -> Result<Arc<dyn ProcessRunner>> {
self.process_runner.clone().ok_or_else(|| {
AppError::configuration(
"this application has no process runner — add `.process_runner(...)` to its \
composition root",
)
})
}
pub fn global_shortcuts(&self) -> Result<Arc<dyn GlobalShortcutService>> {
self.global_shortcuts.clone().ok_or_else(|| {
AppError::configuration(
"this application has no global shortcut service — add `.global_shortcuts(...)` to its \
composition root",
)
})
}
}