diff options
author | Dmitry Sharshakov | 2021-08-23 14:18:03 +0000 |
---|---|---|
committer | Dmitry Sharshakov | 2021-08-23 14:18:03 +0000 |
commit | 839d2105739036decf045f6af85ce05152f514ef (patch) | |
tree | 77e1cbe1da8cabaf8ccb3973fe9ed445ff87df3a /helix-dap | |
parent | f55a012fb744b258ac84ac0302cb0b87f7d35173 (diff) |
Enable stdio transport via config
Diffstat (limited to 'helix-dap')
-rw-r--r-- | helix-dap/src/client.rs | 40 | ||||
-rw-r--r-- | helix-dap/src/types.rs | 3 |
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 { |