registry.rs

 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}