go.rs

 1use gpui::AsyncApp;
 2use std::{ffi::OsStr, path::PathBuf};
 3use task::DebugTaskDefinition;
 4
 5use crate::*;
 6
 7#[derive(Default, Debug)]
 8pub(crate) struct GoDebugAdapter;
 9
10impl GoDebugAdapter {
11    const ADAPTER_NAME: &'static str = "Delve";
12}
13
14#[async_trait(?Send)]
15impl DebugAdapter for GoDebugAdapter {
16    fn name(&self) -> DebugAdapterName {
17        DebugAdapterName(Self::ADAPTER_NAME.into())
18    }
19
20    async fn get_binary(
21        &self,
22        delegate: &dyn DapDelegate,
23        config: &DebugAdapterConfig,
24        user_installed_path: Option<PathBuf>,
25        cx: &mut AsyncApp,
26    ) -> Result<DebugAdapterBinary> {
27        self.get_installed_binary(delegate, config, user_installed_path, cx)
28            .await
29    }
30
31    async fn fetch_latest_adapter_version(
32        &self,
33        _delegate: &dyn DapDelegate,
34    ) -> Result<AdapterVersion> {
35        unimplemented!("This adapter is used from path for now");
36    }
37
38    async fn install_binary(
39        &self,
40        version: AdapterVersion,
41        delegate: &dyn DapDelegate,
42    ) -> Result<()> {
43        adapters::download_adapter_from_github(
44            self.name(),
45            version,
46            adapters::DownloadedFileType::Zip,
47            delegate,
48        )
49        .await?;
50        Ok(())
51    }
52
53    async fn get_installed_binary(
54        &self,
55        delegate: &dyn DapDelegate,
56        config: &DebugAdapterConfig,
57        _: Option<PathBuf>,
58        _: &mut AsyncApp,
59    ) -> Result<DebugAdapterBinary> {
60        let delve_path = delegate
61            .which(OsStr::new("dlv"))
62            .and_then(|p| p.to_str().map(|p| p.to_string()))
63            .ok_or(anyhow!("Dlv not found in path"))?;
64
65        let tcp_connection = config.tcp_connection.clone().unwrap_or_default();
66        let (host, port, timeout) = crate::configure_tcp_connection(tcp_connection).await?;
67
68        Ok(DebugAdapterBinary {
69            command: delve_path,
70            arguments: Some(vec![
71                "dap".into(),
72                "--listen".into(),
73                format!("{}:{}", host, port).into(),
74            ]),
75            cwd: None,
76            envs: None,
77            connection: Some(adapters::TcpArguments {
78                host,
79                port,
80                timeout,
81            }),
82        })
83    }
84
85    fn request_args(&self, config: &DebugTaskDefinition) -> Value {
86        match &config.request {
87            dap::DebugRequestType::Attach(attach_config) => {
88                json!({
89                    "processId": attach_config.process_id
90                })
91            }
92            dap::DebugRequestType::Launch(launch_config) => json!({
93                "program": launch_config.program,
94                "cwd": launch_config.cwd,
95            }),
96        }
97    }
98}