dap.rs

 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}