use crate::{HostConfig, TauriNotificationService, TauriOpener};
use origin_domain::Result;
use origin_http::HttpClient;
use origin_http_reqwest::ReqwestHttpClient;
use origin_platform::{NotificationService, Opener};
use origin_secrets::SecretStore;
use origin_secrets_system::SystemSecretStore;
use origin_storage::Storage;
use origin_storage_sqlite::SqliteStorage;
use std::sync::Arc;
use tauri::{AppHandle, Runtime};
const DATABASE_FILE: &str = "origin.sqlite3";
pub fn storage<R: Runtime>(app: &AppHandle<R>, config: &HostConfig) -> Result<Arc<dyn Storage>> {
let _ = app;
let path = origin_platform::paths::data_dir(&config.app_id)?.join(DATABASE_FILE);
tracing::debug!(path = %path.display(), "opening application database");
Ok(Arc::new(SqliteStorage::open(path)?))
}
pub fn secret_store(config: &HostConfig) -> Arc<dyn SecretStore> {
Arc::new(SystemSecretStore::new(config.app_id.clone()))
}
pub fn notifications<R: Runtime>(app: &AppHandle<R>) -> Arc<dyn NotificationService> {
Arc::new(TauriNotificationService::new(app.clone()))
}
pub fn http_client<R: Runtime>(
app: &AppHandle<R>,
config: &HostConfig,
) -> Result<Arc<dyn HttpClient>> {
let package = app.package_info();
let user_agent = format!("{}/{} ({})", package.name, package.version, config.app_id);
Ok(Arc::new(ReqwestHttpClient::new(user_agent)?))
}
pub fn opener<R: Runtime>(app: &AppHandle<R>) -> Arc<dyn Opener> {
Arc::new(TauriOpener::new(app.clone()))
}