debugger beta: Fix panic that could occur when parsing an invalid dap schema (#31175)

Anthony Eid created

Release Notes:

- N/A

Change summary

crates/dap/src/adapters.rs        |  7 ++++---
crates/dap_adapters/src/go.rs     |  5 ++++-
crates/dap_adapters/src/php.rs    | 10 +++++++++-
crates/dap_adapters/src/python.rs |  5 ++++-
4 files changed, 21 insertions(+), 6 deletions(-)

Detailed changes

crates/dap/src/adapters.rs 🔗

@@ -375,9 +375,10 @@ pub trait DebugAdapter: 'static + Send + Sync {
     ) -> Result<StartDebuggingRequestArgumentsRequest> {
         let map = config.as_object().context("Config isn't an object")?;
 
-        let request_variant = map["request"]
-            .as_str()
-            .ok_or_else(|| anyhow!("request is not valid"))?;
+        let request_variant = map
+            .get("request")
+            .and_then(|val| val.as_str())
+            .context("request argument is not found or invalid")?;
 
         match request_variant {
             "launch" => Ok(StartDebuggingRequestArgumentsRequest::Launch),

crates/dap_adapters/src/go.rs 🔗

@@ -289,7 +289,10 @@ impl DebugAdapter for GoDebugAdapter {
     ) -> Result<StartDebuggingRequestArgumentsRequest> {
         let map = config.as_object().context("Config isn't an object")?;
 
-        let request_variant = map["request"].as_str().context("request is not valid")?;
+        let request_variant = map
+            .get("request")
+            .and_then(|val| val.as_str())
+            .context("request argument is not found or invalid")?;
 
         match request_variant {
             "launch" => Ok(StartDebuggingRequestArgumentsRequest::Launch),

crates/dap_adapters/src/php.rs 🔗

@@ -2,6 +2,7 @@ use adapters::latest_github_release;
 use anyhow::Context as _;
 use anyhow::bail;
 use dap::StartDebuggingRequestArguments;
+use dap::StartDebuggingRequestArgumentsRequest;
 use dap::adapters::{DebugTaskDefinition, TcpArguments};
 use gpui::{AsyncApp, SharedString};
 use language::LanguageName;
@@ -46,6 +47,13 @@ impl PhpDebugAdapter {
         })
     }
 
+    fn validate_config(
+        &self,
+        _: &serde_json::Value,
+    ) -> Result<StartDebuggingRequestArgumentsRequest> {
+        Ok(StartDebuggingRequestArgumentsRequest::Launch)
+    }
+
     async fn get_installed_binary(
         &self,
         delegate: &Arc<dyn DapDelegate>,
@@ -93,7 +101,7 @@ impl PhpDebugAdapter {
             envs: HashMap::default(),
             request_args: StartDebuggingRequestArguments {
                 configuration: task_definition.config.clone(),
-                request: dap::StartDebuggingRequestArgumentsRequest::Launch,
+                request: self.validate_config(&task_definition.config)?,
             },
         })
     }

crates/dap_adapters/src/python.rs 🔗

@@ -201,7 +201,10 @@ impl DebugAdapter for PythonDebugAdapter {
     ) -> Result<StartDebuggingRequestArgumentsRequest> {
         let map = config.as_object().context("Config isn't an object")?;
 
-        let request_variant = map["request"].as_str().context("request is not valid")?;
+        let request_variant = map
+            .get("request")
+            .and_then(|val| val.as_str())
+            .context("request is not valid")?;
 
         match request_variant {
             "launch" => Ok(StartDebuggingRequestArgumentsRequest::Launch),