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 kind = adapter
55 .request_kind(&scenario.config)
56 .ok()
57 .map(serde_json::to_value)
58 .and_then(Result::ok);
59 let dock = DebuggerSettings::get_global(cx).dock;
60 telemetry::event!(
61 "Debugger Session Started",
62 spawn_location = location,
63 with_build_task = scenario.build.is_some(),
64 kind = kind,
65 adapter = scenario.adapter.as_ref(),
66 dock_position = dock,
67 );
68}