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 serde_json::Value;
55use tauri::{State, command};
56
57use crate::{ApplicationState::State::ApplicationState::ApplicationState, dev_log};
58
59/// A specific Tauri command handler for the UI to send back the result of a
60/// request-response interaction (like a dialog or message box).
61#[command]
62pub async fn ResolveUIRequest(
63 State:State<'_, Arc<ApplicationState>>,
64
65 RequestID:String,
66
67 Result:Value,
68) -> Result<(), String> {
69 dev_log!("ipc", "[Track/UIRequest] Resolving UI request ID: {}", RequestID);
70
71 let Sender = {
72 let mut PendingRequests = State.UI.PendingUserInterfaceRequest.lock().map_err(|Error| Error.to_string())?;
73
74 PendingRequests.remove(&RequestID)
75 };
76
77 if let Some(Sender) = Sender {
78 if Sender.send(Ok(Result)).is_err() {
79 let ErrorMessage = format!("Failed to send result for UI request '{}': receiver was dropped.", RequestID);
80
81 dev_log!("ipc", "error: {}", ErrorMessage);
82
83 return Err(ErrorMessage);
84 }
85 } else {
86 dev_log!(
87 "ipc",
88 "warn: [Track/UIRequest] Received a result for an unknown or timed-out UI request ID: {}",
89 RequestID
90 );
91 }
92
93 Ok(())
94}