aboutsummaryrefslogtreecommitdiff
path: root/helix-dap/src
diff options
context:
space:
mode:
authorDmitry Sharshakov2021-08-23 14:18:03 +0000
committerDmitry Sharshakov2021-08-23 14:18:03 +0000
commit839d2105739036decf045f6af85ce05152f514ef (patch)
tree77e1cbe1da8cabaf8ccb3973fe9ed445ff87df3a /helix-dap/src
parentf55a012fb744b258ac84ac0302cb0b87f7d35173 (diff)
Enable stdio transport via config
Diffstat (limited to 'helix-dap/src')
-rw-r--r--helix-dap/src/client.rs40
-rw-r--r--helix-dap/src/types.rs3
2 files changed, 37 insertions, 6 deletions
diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs
index 79c65cf7..9a2e3920 100644
--- a/helix-dap/src/client.rs
+++ b/helix-dap/src/client.rs
@@ -1,8 +1,9 @@
use crate::{
transport::{Payload, Request, Transport},
types::*,
- Result,
+ Error, Result,
};
+use anyhow::anyhow;
pub use log::{error, info};
use std::{
collections::HashMap,
@@ -35,6 +36,33 @@ pub struct Client {
}
impl Client {
+ // Spawn a process and communicate with it by either TCP or stdio
+ pub async fn process(
+ cfg: DebugAdapterConfig,
+ id: usize,
+ ) -> Result<(Self, UnboundedReceiver<Payload>)> {
+ if cfg.transport == "tcp" && cfg.port_arg.is_some() {
+ Self::tcp_process(
+ &cfg.command,
+ cfg.args.iter().map(|s| s.as_str()).collect(),
+ &cfg.port_arg.unwrap(),
+ id,
+ )
+ .await
+ } else if cfg.transport == "stdio" {
+ Self::stdio(
+ &cfg.command,
+ cfg.args.iter().map(|s| s.as_str()).collect(),
+ id,
+ )
+ } else {
+ Result::Err(Error::Other(anyhow!(
+ "Incorrect transport {}",
+ cfg.transport
+ )))
+ }
+ }
+
pub fn streams(
rx: Box<dyn AsyncBufRead + Unpin + Send>,
tx: Box<dyn AsyncWrite + Unpin + Send>,
@@ -113,14 +141,16 @@ impl Client {
}
pub async fn tcp_process(
- config: DebugAdapterConfig,
+ cmd: &str,
+ args: Vec<&str>,
+ port_format: &str,
id: usize,
) -> Result<(Self, UnboundedReceiver<Payload>)> {
let port = Self::get_port().await.unwrap();
- let process = Command::new(config.command)
- .args(config.args)
- .args(config.port_arg.replace("{}", &port.to_string()).split(' '))
+ let process = Command::new(cmd)
+ .args(args)
+ .args(port_format.replace("{}", &port.to_string()).split(' '))
// silence messages
.stdin(Stdio::null())
.stdout(Stdio::null())
diff --git a/helix-dap/src/types.rs b/helix-dap/src/types.rs
index 152996a1..a31bc1d1 100644
--- a/helix-dap/src/types.rs
+++ b/helix-dap/src/types.rs
@@ -5,9 +5,10 @@ use std::path::PathBuf;
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
#[serde(rename_all = "kebab-case")]
pub struct DebugAdapterConfig {
+ pub transport: String,
pub command: String,
pub args: Vec<String>,
- pub port_arg: String,
+ pub port_arg: Option<String>,
}
pub trait Request {