use std::path::PathBuf;
use std::sync::Arc;
pub mod core;
mod commands;
use crate::core::manifest::Manifest;
use crate::core::connectors::ConnectorManager;
use crate::core::action_engine::ActionEngine;
use crate::core::renderer::Renderer;
use crate::core::asset_loader::AssetLoader;
use crate::core::sockets::SocketManager;
use crate::commands::run_action;
pub use self::builder::Builder;
pub struct AppState {
pub manifest: Manifest,
pub connector_manager: Arc<ConnectorManager>,
pub action_engine: Arc<ActionEngine>,
pub renderer: Arc<Renderer>,
pub asset_loader: Arc<AssetLoader>,
pub socket_manager: Arc<SocketManager>,
}
mod builder {
use super::*;
pub struct Builder {
app_path: PathBuf,
}
impl Builder {
pub fn new(app_path: impl Into<PathBuf>) -> Self {
Self { app_path: app_path.into() }
}
pub fn build(self) -> tauri::Builder<tauri::Wry> {
let manifest_path = self.app_path.join("manifest.json");
let manifest_content = std::fs::read_to_string(&manifest_path)
.unwrap_or_else(|error| panic!("FATAL: Failed to read manifest.json from {:?}. Error: {}", manifest_path, error));
let manifest: Manifest = serde_json::from_str(&manifest_content)
.unwrap_or_else(|error| panic!("FATAL: Failed to parse manifest.json. Error: {}", error));
let asset_loader = AssetLoader::new(&self.app_path, &manifest)
.expect("FATAL: Failed to load application assets");
let data_path = self.app_path.join("data");
let connector_manager = ConnectorManager::new(&manifest.connectors, data_path)
.expect("FATAL: Failed to initialize connectors");
let action_engine = ActionEngine::new();
let renderer = Renderer::new();
let socket_manager = SocketManager::new();
let state = AppState {
manifest,
connector_manager: Arc::new(connector_manager),
action_engine: Arc::new(action_engine),
renderer: Arc::new(renderer),
asset_loader: Arc::new(asset_loader),
socket_manager: Arc::new(socket_manager),
};
tauri::Builder::default()
.manage(state) .invoke_handler(tauri::generate_handler![
run_action,
])
}
}
}