Mountain/Track/UIRequest/
ResolveUIRequest.rs

1//! # ResolveUIRequest (Track)
2//!
3//! ## RESPONSIBILITIES
4//!
5//! This module provides a Tauri command handler for the UI to send back the
6//! result of a request-response interaction (like a dialog or message box).
7//!
8//! ### Core Functions:
9//! - Look up pending UI request by ID
10//! - Remove request from pending requests map
11//! - Send result through oneshot channel
12//! - Handle dropped receiver errors gracefully
13//!
14//! ## ARCHITECTURAL ROLE
15//!
16//! ResolveUIRequest acts as the **UI response handler** in Track's dispatch
17//! layer:
18//!
19//! ```text
20//! UI (Frontend) ──► ResolveUIRequest ──► Complete Pending Request ──► Return Result
21//! ```
22//!
23//! ## KEY COMPONENTS
24//!
25//! - **Fn**: Main UI request resolution function (public async fn Fn)
26//!
27//! ## ERROR HANDLING
28//!
29//! - Unknown or timed-out requests are logged as warnings
30//! - Dropped receiver errors are logged and returned as errors
31//! - Lock errors on pending requests map are propagated
32//!
33//! ## LOGGING
34//!
35//! - All UI request resolutions are logged at debug level
36//! - Unknown/timed-out requests are logged at warn level
37//! - Dropped receiver errors are logged at error level
38//! - Log format: "[Track/UIRequest] Resolving UI request ID: {}"
39//!
40//! ## PERFORMANCE CONSIDERATIONS
41//!
42//! - Minimal locking duration on pending requests map
43//! - Fast lookup and removal from HashMap
44//! - Non-blocking channel sends
45//!
46//! ## TODO
47//!
48//! - [ ] Add request timeout handling
49//! - [ ] Implement request cancellation support (VS Code compatibility)
50//! - [ ] Add request metrics and telemetry
51
52use std::sync::Arc;
53
54use log::{debug, error, warn};
55use serde_json::Value;
56use tauri::{State, command};
57
58use crate::ApplicationState::ApplicationState;
59
60/// A specific Tauri command handler for the UI to send back the result of a
61/// request-response interaction (like a dialog or message box).
62#[command]
63pub async fn ResolveUIRequest(
64	State:State<'_, Arc<ApplicationState>>,
65
66	RequestID:String,
67
68	Result:Value,
69) -> Result<(), String> {
70	debug!("[Track/UIRequest] Resolving UI request ID: {}", RequestID);
71
72	let Sender = {
73		let mut PendingRequests = State
74			.UI
75			.PendingUserInterfaceRequests
76			.lock()
77			.map_err(|Error| Error.to_string())?;
78
79		PendingRequests.remove(&RequestID)
80	};
81
82	if let Some(Sender) = Sender {
83		if Sender.send(Ok(Result)).is_err() {
84			let ErrorMessage = format!("Failed to send result for UI request '{}': receiver was dropped.", RequestID);
85
86			error!("{}", ErrorMessage);
87
88			return Err(ErrorMessage);
89		}
90	} else {
91		warn!(
92			"[Track/UIRequest] Received a result for an unknown or timed-out UI request ID: {}",
93			RequestID
94		);
95	}
96
97	Ok(())
98}