Mountain/Command/Hover/
Fn.rs1use serde_json::Value;
24use tauri::{AppHandle, Wry};
25use url::Url;
26
27use crate::Command::Hover::Interface::{HoverRequest, HoverResponse, Position};
28use crate::dev_log;
29
30fn ValidateRequest(uri:&str, position:&Value) -> Result<HoverRequest, String> {
32 let document_uri = Url::parse(uri).map_err(|e| format!("Invalid URI: {}", e))?;
34
35 let position_dto:Position =
37 serde_json::from_value(position.clone()).map_err(|e| format!("Invalid position: {}", e))?;
38
39 Ok(HoverRequest { uri:document_uri.to_string(), position:position_dto })
40}
41
42pub async fn Hover(application_handle:AppHandle<Wry>, uri:String, position:Value) -> Result<HoverResponse, String> {
57 dev_log!("commands", "[Hover] Providing hover for: {} at {:?}", uri, position);
58
59 let request = ValidateRequest(&uri, &position)?;
61
62 let document_uri = Url::parse(&request.uri).map_err(|e| format!("Failed to parse URI: {}", e))?;
64
65 let _result = ProvideHover(document_uri, request.position).await?;
68
69 Ok(HoverResponse::default())
73}
74
75async fn ProvideHover(_uri:Url, _position:Position) -> Result<HoverResponse, String> {
80 dev_log!("commands", "[Hover] Calling provider for hover information");
86
87 Ok(HoverResponse::default())
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93
94 #[test]
95 fn test_validate_request_valid() {
96 let uri = "file:///test.rs";
97 let position = serde_json::json!({
98 "line": 10,
99 "character": 5
100 });
101
102 let result = ValidateRequest(uri, &position);
103 assert!(result.is_ok());
104
105 let request = result.unwrap();
106 assert_eq!(request.uri, uri);
107 assert_eq!(request.position.line, 10);
108 assert_eq!(request.position.character, 5);
109 }
110
111 #[test]
112 fn test_validate_request_invalid_uri() {
113 let uri = "not-a-valid-uri";
114 let position = serde_json::json!({
115 "line": 10,
116 "character": 5
117 });
118
119 let result = ValidateRequest(uri, &position);
120 assert!(result.is_err());
121 }
122
123 #[test]
124 fn test_validate_request_invalid_position() {
125 let uri = "file:///test.rs";
126 let position = serde_json::json!({
127 "not_a_position": true
128 });
129
130 let result = ValidateRequest(uri, &position);
131 assert!(result.is_err());
132 }
133
134 #[test]
135 fn test_hover_response_default() {
136 let response = HoverResponse::default();
137 assert!(response.contents.is_empty());
138 assert!(response.range.is_none());
139 }
140
141 #[test]
142 fn test_hover_response_with_contents() {
143 use crate::Command::Hover::Interface::HoverContent;
144
145 let contents = vec![HoverContent::PlainText("Test hover".to_string())];
146 let response = HoverResponse::new(contents);
147
148 assert_eq!(response.contents.len(), 1);
149 assert!(response.range.is_none());
150 }
151}