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}