From baed8cd4dfaf5789d2beef81e0c5b5272c402030 Mon Sep 17 00:00:00 2001 From: Riccardo Strina Date: Sat, 7 Nov 2026 09:40:35 +0100 Subject: [PATCH 1/2] Assign default value to debugger LSP struct - Errors reported by the debugger could be missing the data field, breaking the expected contract from Zed during deserialization. Now errors are correctly reported instead of failing during deserialization. --- src/lsp.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lsp.rs b/src/lsp.rs index 8a78a56..07483af 100644 --- a/src/lsp.rs +++ b/src/lsp.rs @@ -104,6 +104,7 @@ pub enum LspResponse { pub struct LspError { code: i64, message: String, + #[serde(default)] data: Value, } From bcf5e8c1e9a838f7f16d222d4dc139caa7f7c310 Mon Sep 17 00:00:00 2001 From: Riccardo Strina Date: Sat, 7 Nov 2026 14:28:13 +0100 Subject: [PATCH 2/2] Add unit test to verify serde dafault --- src/lsp.rs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/lsp.rs b/src/lsp.rs index 07483af..f2a7eed 100644 --- a/src/lsp.rs +++ b/src/lsp.rs @@ -115,3 +115,33 @@ pub struct MainClassEntry { pub project_name: String, pub file_path: String, } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn error_response_without_data_defaults_to_null() { + let response: LspResponse> = serde_json::from_str( + r#"{ + "jsonrpc": "2.0", + "id": "proxy-http-1", + "error": { + "code": -32601, + "message": "No delegateCommandHandler for vscode.java.resolveMainClass" + } + }"#, + ) + .expect("an LSP error response may omit data"); + + let LspResponse::Error { error } = response else { + panic!("expected an LSP error response"); + }; + assert_eq!(error.data, Value::Null); + assert_eq!(error.code, -32601); + assert_eq!( + error.message, + "No delegateCommandHandler for vscode.java.resolveMainClass" + ); + } +}