// Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] mod utilities; mod controllers; mod viewers; use log::info; use utilities::config::load_config; use utilities::logging::setup_logging; use controllers::app_state::init_state; use controllers::settings::{get_settings, save_settings}; use controllers::greet::greet; use viewers::tray::setup_tray; #[tokio::main] async fn main() { // 1. Load configuration let config = match load_config() { Ok(c) => c, Err(e) => { eprintln!("Failed to load config: {}", e); // Default config fallback logic is inside load_config, but if file IO fails we might get here. // We can try to proceed with default logging if possible, but for now just print to stderr. return; } }; // 2. Init logging if let Err(e) = setup_logging(&config) { eprintln!("Failed to setup logging: {}", e); } info!("Application started"); tauri::Builder::default() .invoke_handler(tauri::generate_handler![get_settings, save_settings, greet]) .setup(|app| { info!("Setting up application..."); // 3. Init State init_state(app); // 4. Setup Tray setup_tray(app)?; Ok(()) }) .on_window_event(|window, event| { if let tauri::WindowEvent::CloseRequested { api, .. } = event { // Prevent the window from closing (destroying) // Instead, hide it. This keeps the app running in the tray. window.hide().unwrap(); api.prevent_close(); } }) .run(tauri::generate_context!()) .expect("error while running tauri application"); }