Enable stdio transport via config

imgbot
Dmitry Sharshakov 3 years ago
parent f55a012fb7
commit 839d210573
No known key found for this signature in database
GPG Key ID: 471FD32E15FD8473

@ -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())

@ -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 {

@ -4362,7 +4362,7 @@ fn dap_start(cx: &mut Context) {
return;
}
};
let started = Client::tcp_process(config, 0);
let started = Client::process(config, 0);
let (mut debugger, events) = block_on(started).unwrap();
let request = debugger.initialize("go".to_owned());

@ -93,7 +93,7 @@ comment-token = "//"
language-server = { command = "gopls" }
# TODO: gopls needs utf-8 offsets?
indent = { tab-width = 4, unit = "\t" }
debug-adapter = { command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" }
debug-adapter = { transport = "tcp", command = "dlv", args = ["dap"], port-arg = "-l 127.0.0.1:{}" }
[[language.debug-configs]]
request = "launch"

Loading…
Cancel
Save