Mountain/Command/Hover/
Fn.rs1use serde_json::Value;
24use tauri::{AppHandle, Wry};
25use url::Url;
26
27use crate::{
28 Command::Hover::Interface::{
29 HoverRequest::Struct as HoverRequest,
30 HoverResponse::Struct as HoverResponse,
31 Position::Struct as Position,
32 },
33 dev_log,
34};
35
36fn ValidateRequest(uri:&str, position:&Value) -> Result<HoverRequest, String> {
38 let document_uri = Url::parse(uri).map_err(|e| format!("Invalid URI: {}", e))?;
40
41 let position_dto:Position =
43 serde_json::from_value(position.clone()).map_err(|e| format!("Invalid position: {}", e))?;
44
45 Ok(HoverRequest { uri:document_uri.to_string(), position:position_dto })
46}
47
48pub async fn Hover(application_handle:AppHandle<Wry>, uri:String, position:Value) -> Result<HoverResponse, String> {
63 dev_log!("commands", "[Hover] Providing hover for: {} at {:?}", uri, position);
64
65 let request = ValidateRequest(&uri, &position)?;
67
68 let document_uri = Url::parse(&request.uri).map_err(|e| format!("Failed to parse URI: {}", e))?;
70
71 let _result = ProvideHover(document_uri, request.position).await?;
74
75 Ok(HoverResponse::default())
79}
80
81async fn ProvideHover(_uri:Url, _position:Position) -> Result<HoverResponse, String> {
86 dev_log!("commands", "[Hover] Calling provider for hover information");
92
93 Ok(HoverResponse::default())
94}
95
96#[cfg(test)]
97mod tests {
98
99 use super::*;
100
101 #[test]
102 fn test_validate_request_valid() {
103 let uri = "file:///test.rs";
104
105 let position = serde_json::json!({
106 "line": 10,
107 "character": 5
108 });
109
110 let result = ValidateRequest(uri, &position);
111
112 assert!(result.is_ok());
113
114 let request = result.unwrap();
115
116 assert_eq!(request.uri, uri);
117
118 assert_eq!(request.position.line, 10);
119
120 assert_eq!(request.position.character, 5);
121 }
122
123 #[test]
124 fn test_validate_request_invalid_uri() {
125 let uri = "not-a-valid-uri";
126
127 let position = serde_json::json!({
128 "line": 10,
129 "character": 5
130 });
131
132 let result = ValidateRequest(uri, &position);
133
134 assert!(result.is_err());
135 }
136
137 #[test]
138 fn test_validate_request_invalid_position() {
139 let uri = "file:///test.rs";
140
141 let position = serde_json::json!({
142 "not_a_position": true
143 });
144
145 let result = ValidateRequest(uri, &position);
146
147 assert!(result.is_err());
148 }
149
150 #[test]
151 fn test_hover_response_default() {
152 let response = HoverResponse::default();
153
154 assert!(response.contents.is_empty());
155
156 assert!(response.range.is_none());
157 }
158
159 #[test]
160 fn test_hover_response_with_contents() {
161 use crate::Command::Hover::Interface::HoverContent::Enum as HoverContent;
162
163 let contents = vec![HoverContent::PlainText("Test hover".to_string())];
164
165 let response = HoverResponse::new(contents);
166
167 assert_eq!(response.contents.len(), 1);
168
169 assert!(response.range.is_none());
170 }
171}