1use gpui::{App, Global};
2use parking_lot::RwLock;
3
4use crate::adapters::{DebugAdapter, DebugAdapterName};
5use std::{collections::BTreeMap, sync::Arc};
6
7#[derive(Default)]
8struct DapRegistryState {
9 adapters: BTreeMap<DebugAdapterName, Arc<dyn DebugAdapter>>,
10}
11
12#[derive(Clone, Default)]
13/// Stores available debug adapters.
14pub struct DapRegistry(Arc<RwLock<DapRegistryState>>);
15impl Global for DapRegistry {}
16
17impl DapRegistry {
18 pub fn global(cx: &mut App) -> &mut Self {
19 let ret = cx.default_global::<Self>();
20
21 #[cfg(any(test, feature = "test-support"))]
22 if ret.adapter(crate::FakeAdapter::ADAPTER_NAME).is_none() {
23 ret.add_adapter(Arc::new(crate::FakeAdapter::new()));
24 }
25
26 ret
27 }
28
29 pub fn add_adapter(&self, adapter: Arc<dyn DebugAdapter>) {
30 let name = adapter.name();
31 let _previous_value = self.0.write().adapters.insert(name, adapter);
32 debug_assert!(
33 _previous_value.is_none(),
34 "Attempted to insert a new debug adapter when one is already registered"
35 );
36 }
37
38 pub fn adapter(&self, name: &str) -> Option<Arc<dyn DebugAdapter>> {
39 self.0.read().adapters.get(name).cloned()
40 }
41
42 pub fn enumerate_adapters(&self) -> Vec<DebugAdapterName> {
43 self.0.read().adapters.keys().cloned().collect()
44 }
45}