dap_adapters.rs

 1mod custom;
 2#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
 3mod gdb;
 4mod go;
 5mod javascript;
 6mod lldb;
 7mod php;
 8mod python;
 9
10use std::{collections::HashMap, sync::Arc};
11
12use anyhow::{anyhow, bail, Result};
13use async_trait::async_trait;
14use custom::CustomDebugAdapter;
15use dap::adapters::{
16    self, AdapterVersion, DapDelegate, DebugAdapter, DebugAdapterBinary, DebugAdapterName,
17    GithubRepo,
18};
19#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
20use gdb::GdbDebugAdapter;
21use go::GoDebugAdapter;
22use javascript::JsDebugAdapter;
23use lldb::LldbDebugAdapter;
24use php::PhpDebugAdapter;
25use python::PythonDebugAdapter;
26use serde_json::{json, Value};
27use sysinfo::{Pid, Process};
28use task::{CustomArgs, DebugAdapterConfig, DebugAdapterKind, DebugConnectionType, TCPHost};
29
30pub async fn build_adapter(kind: &DebugAdapterKind) -> Result<Arc<dyn DebugAdapter>> {
31    match kind {
32        DebugAdapterKind::Custom(start_args) => {
33            Ok(Arc::new(CustomDebugAdapter::new(start_args.clone()).await?))
34        }
35        DebugAdapterKind::Python(host) => Ok(Arc::new(PythonDebugAdapter::new(host).await?)),
36        DebugAdapterKind::Php(host) => Ok(Arc::new(PhpDebugAdapter::new(host.clone()).await?)),
37        DebugAdapterKind::Javascript(host) => {
38            Ok(Arc::new(JsDebugAdapter::new(host.clone()).await?))
39        }
40        DebugAdapterKind::Lldb => Ok(Arc::new(LldbDebugAdapter::new())),
41        DebugAdapterKind::Go(host) => Ok(Arc::new(GoDebugAdapter::new(host).await?)),
42        #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
43        DebugAdapterKind::Gdb => Ok(Arc::new(GdbDebugAdapter::new())),
44        #[cfg(any(test, feature = "test-support"))]
45        DebugAdapterKind::Fake(_) => Ok(Arc::new(dap::adapters::FakeAdapter::new())),
46        #[cfg(not(any(test, feature = "test-support")))]
47        #[allow(unreachable_patterns)]
48        _ => unreachable!("Fake variant only exists with test-support feature"),
49    }
50}
51
52pub fn attach_processes<'a>(
53    kind: &DebugAdapterKind,
54    processes: &'a HashMap<Pid, Process>,
55) -> Vec<(&'a Pid, &'a Process)> {
56    match kind {
57        #[cfg(any(test, feature = "test-support"))]
58        DebugAdapterKind::Fake(_) => processes
59            .iter()
60            .filter(|(pid, _)| pid.as_u32() == std::process::id())
61            .collect::<Vec<_>>(),
62        DebugAdapterKind::Custom(_) => CustomDebugAdapter::attach_processes(processes),
63        DebugAdapterKind::Javascript(_) => JsDebugAdapter::attach_processes(processes),
64        DebugAdapterKind::Lldb => LldbDebugAdapter::attach_processes(processes),
65        _ => processes.iter().collect::<Vec<_>>(),
66    }
67}