use std::sync::Arc;
use tokio::sync::Mutex;
use crate::app_state::AppState;
use crate::cli::{LocalArgs, ViewArgs};
use crate::view::{
data_collector::DataCollector, terminal_manager::TerminalManager, ui_loop::UiLoop,
};
pub async fn run_local_mode(args: &LocalArgs) {
let mut startup_profiler = crate::utils::StartupProfiler::new();
startup_profiler.checkpoint("Starting run_local_mode");
let mut initial_state = AppState::new();
initial_state.is_local_mode = true;
let app_state = Arc::new(Mutex::new(initial_state));
startup_profiler.checkpoint("AppState initialized");
let _terminal_manager = match TerminalManager::new() {
Ok(manager) => manager,
Err(e) => {
eprintln!("Failed to initialize terminal: {e}");
return;
}
};
startup_profiler.checkpoint("Terminal initialized");
let data_collector = DataCollector::new(Arc::clone(&app_state));
let view_args = ViewArgs {
hosts: None,
hostfile: None,
interval: args.interval,
};
tokio::spawn(async move {
data_collector.run_local_mode(view_args).await;
});
startup_profiler.checkpoint("Data collector spawned");
let mut ui_loop = match UiLoop::new(app_state) {
Ok(ui_loop) => ui_loop,
Err(e) => {
eprintln!("Failed to initialize UI: {e}");
return;
}
};
startup_profiler.checkpoint("UI loop initialized");
startup_profiler.finish();
let view_args = ViewArgs {
hosts: None,
hostfile: None,
interval: args.interval,
};
if let Err(e) = ui_loop.run(&view_args).await {
eprintln!("UI loop error: {e}");
}
}
pub async fn run_view_mode(args: &ViewArgs) {
let mut initial_state = AppState::new();
initial_state.is_local_mode = false;
let app_state = Arc::new(Mutex::new(initial_state));
let _terminal_manager = match TerminalManager::new() {
Ok(manager) => manager,
Err(e) => {
eprintln!("Failed to initialize terminal: {e}");
return;
}
};
let data_collector = DataCollector::new(Arc::clone(&app_state));
let args_clone = args.clone();
tokio::spawn(async move {
let hosts = args_clone.hosts.clone().unwrap_or_default();
let hostfile = args_clone.hostfile.clone();
data_collector
.run_remote_mode(args_clone, hosts, hostfile)
.await;
});
let mut ui_loop = match UiLoop::new(app_state) {
Ok(ui_loop) => ui_loop,
Err(e) => {
eprintln!("Failed to initialize UI: {e}");
return;
}
};
if let Err(e) = ui_loop.run(args).await {
eprintln!("UI loop error: {e}");
}
}