1pub mod adapters;
2pub mod client;
3pub mod debugger_settings;
4pub mod inline_value;
5pub mod proto_conversions;
6mod registry;
7pub mod transport;
8
9use std::net::Ipv4Addr;
10
11pub use dap_types::*;
12use debugger_settings::DebuggerSettings;
13use gpui::App;
14pub use registry::{DapLocator, DapRegistry};
15use serde::Serialize;
16use settings::Settings;
17pub use task::DebugRequest;
18
19pub type ScopeId = u64;
20pub type VariableReference = u64;
21pub type StackFrameId = u64;
22
23#[cfg(any(test, feature = "test-support"))]
24pub use adapters::FakeAdapter;
25use task::{DebugScenario, TcpArgumentsTemplate};
26
27pub async fn configure_tcp_connection(
28 tcp_connection: TcpArgumentsTemplate,
29) -> anyhow::Result<(Ipv4Addr, u16, Option<u64>)> {
30 let host = tcp_connection.host();
31 let timeout = tcp_connection.timeout;
32
33 let port = if let Some(port) = tcp_connection.port {
34 port
35 } else {
36 transport::TcpTransport::port(&tcp_connection).await?
37 };
38
39 Ok((host, port, timeout))
40}
41
42#[derive(Clone, Copy, Serialize)]
43#[serde(rename_all = "snake_case")]
44pub enum TelemetrySpawnLocation {
45 Gutter,
46 ScenarioList,
47 Custom,
48}
49
50pub fn send_telemetry(scenario: &DebugScenario, location: TelemetrySpawnLocation, cx: &App) {
51 let Some(adapter) = cx.global::<DapRegistry>().adapter(&scenario.adapter) else {
52 return;
53 };
54 let dock = DebuggerSettings::get_global(cx).dock;
55 let config = scenario.config.clone();
56 let with_build_task = scenario.build.is_some();
57 let adapter_name = scenario.adapter.clone();
58 cx.spawn(async move |_| {
59 let kind = adapter
60 .request_kind(&config)
61 .await
62 .ok()
63 .map(serde_json::to_value)
64 .and_then(Result::ok);
65
66 telemetry::event!(
67 "Debugger Session Started",
68 spawn_location = location,
69 with_build_task = with_build_task,
70 kind = kind,
71 adapter = adapter_name,
72 dock_position = dock,
73 );
74 })
75 .detach();
76}