dap: support arrays as arguments

This commit is contained in:
Dmitry Sharshakov 2021-10-24 17:24:18 +03:00
parent d6e8a44d85
commit 6aa9838ea6
No known key found for this signature in database
GPG key ID: 471FD32E15FD8473
2 changed files with 30 additions and 7 deletions

View file

@ -104,13 +104,20 @@ pub enum DebugConfigCompletion {
Advanced(AdvancedCompletion), Advanced(AdvancedCompletion),
} }
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
#[serde(untagged)]
pub enum DebugArgumentValue {
String(String),
Array(Vec<String>),
}
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")] #[serde(rename_all = "kebab-case")]
pub struct DebugTemplate { pub struct DebugTemplate {
pub name: String, pub name: String,
pub request: String, pub request: String,
pub completion: Vec<DebugConfigCompletion>, pub completion: Vec<DebugConfigCompletion>,
pub args: HashMap<String, String>, pub args: HashMap<String, DebugArgumentValue>,
} }
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] #[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]

View file

@ -5,7 +5,10 @@ use crate::{
job::Callback, job::Callback,
ui::{FilePicker, Prompt, PromptEvent}, ui::{FilePicker, Prompt, PromptEvent},
}; };
use helix_core::{syntax::DebugConfigCompletion, Selection}; use helix_core::{
syntax::{DebugArgumentValue, DebugConfigCompletion},
Selection,
};
use helix_dap::{self as dap, Client, ThreadId}; use helix_dap::{self as dap, Client, ThreadId};
use helix_lsp::block_on; use helix_lsp::block_on;
@ -239,13 +242,26 @@ pub fn dap_start_impl(
} }
} }
// For param #0 replace {0} in args // For param #0 replace {0} in args
value = value.replace(format!("{{{}}}", i).as_str(), &param); value = match value {
DebugArgumentValue::String(v) => {
DebugArgumentValue::String(v.replace(format!("{{{}}}", i).as_str(), &param))
}
DebugArgumentValue::Array(arr) => DebugArgumentValue::Array(
arr.iter()
.map(|v| v.replace(format!("{{{}}}", i).as_str(), &param))
.collect(),
),
};
} }
if let Ok(integer) = value.parse::<usize>() { if let DebugArgumentValue::String(string) = value {
args.insert(k, Value::Number(serde_json::Number::from(integer))); if let Ok(integer) = string.parse::<usize>() {
} else { args.insert(k, to_value(integer).unwrap());
args.insert(k, Value::String(value)); } else {
args.insert(k, to_value(string).unwrap());
}
} else if let DebugArgumentValue::Array(arr) = value {
args.insert(k, to_value(arr).unwrap());
} }
} }
} }