//! Tauri command surface — every JS-callable function lives here. use crate::paths::{list_wsl_distros, resolve_roots, ResolvedRoots}; use crate::settings::{save as save_settings, Settings}; use crate::state::SharedState; use crate::usage::{build_snapshot, UsageSnapshot}; use crate::watch::refresh_and_emit; #[tauri::command] pub async fn get_snapshot(state: tauri::State<'_, SharedState>) -> Result { let mut events = state.collect_events(); events.sort_by_key(|e| e.ts); let caps = state.settings.read().caps.clone(); Ok(build_snapshot(&events, &caps, chrono::Utc::now())) } #[tauri::command] pub async fn get_settings(state: tauri::State<'_, SharedState>) -> Result { Ok(state.settings.read().clone()) } #[tauri::command] pub async fn set_settings( state: tauri::State<'_, SharedState>, app: tauri::AppHandle, new: Settings, ) -> Result<(), String> { { *state.settings.write() = new.clone(); } save_settings(&new).map_err(|e| e.to_string())?; // If roots-related settings changed, force a re-resolve + rescan. { let mut roots = state.roots.write(); roots.clear(); } refresh_and_emit(&app, state.inner(), None) .await .map_err(|e| e.to_string())?; Ok(()) } #[tauri::command] pub async fn list_distros() -> Result, String> { list_wsl_distros().map_err(|e| e.to_string()) } #[tauri::command] pub async fn get_roots(state: tauri::State<'_, SharedState>) -> Result { let s = state.settings.read().clone(); Ok(resolve_roots(s.wsl_distro_override.as_deref(), s.include_native)) } #[tauri::command] pub async fn force_rescan( state: tauri::State<'_, SharedState>, app: tauri::AppHandle, ) -> Result<(), String> { // Wipe caches so every file is reparsed from offset 0. state.files.write().clear(); state.seen_ids.write().clear(); refresh_and_emit(&app, state.inner(), None) .await .map_err(|e| e.to_string()) } #[tauri::command] pub async fn quit_app(app: tauri::AppHandle) -> Result<(), String> { app.exit(0); Ok(()) }