registry.rs

 1use std::sync::Arc;
 2
 3use collections::HashMap;
 4use gpui::{App, BackgroundExecutor, Global, ReadGlobal, UpdateGlobal};
 5use parking_lot::RwLock;
 6
 7use crate::{IndexedDocsProvider, IndexedDocsStore, ProviderId};
 8
 9struct GlobalIndexedDocsRegistry(Arc<IndexedDocsRegistry>);
10
11impl Global for GlobalIndexedDocsRegistry {}
12
13pub struct IndexedDocsRegistry {
14    executor: BackgroundExecutor,
15    stores_by_provider: RwLock<HashMap<ProviderId, Arc<IndexedDocsStore>>>,
16}
17
18impl IndexedDocsRegistry {
19    pub fn global(cx: &App) -> Arc<Self> {
20        GlobalIndexedDocsRegistry::global(cx).0.clone()
21    }
22
23    pub(crate) fn init_global(cx: &mut App) {
24        GlobalIndexedDocsRegistry::set_global(
25            cx,
26            GlobalIndexedDocsRegistry(Arc::new(Self::new(cx.background_executor().clone()))),
27        );
28    }
29
30    pub fn new(executor: BackgroundExecutor) -> Self {
31        Self {
32            executor,
33            stores_by_provider: RwLock::new(HashMap::default()),
34        }
35    }
36
37    pub fn list_providers(&self) -> Vec<ProviderId> {
38        self.stores_by_provider
39            .read()
40            .keys()
41            .cloned()
42            .collect::<Vec<_>>()
43    }
44
45    pub fn register_provider(
46        &self,
47        provider: Box<dyn IndexedDocsProvider + Send + Sync + 'static>,
48    ) {
49        self.stores_by_provider.write().insert(
50            provider.id(),
51            Arc::new(IndexedDocsStore::new(provider, self.executor.clone())),
52        );
53    }
54
55    pub fn unregister_provider(&self, provider_id: &ProviderId) {
56        self.stores_by_provider.write().remove(provider_id);
57    }
58
59    pub fn get_provider_store(&self, provider_id: ProviderId) -> Option<Arc<IndexedDocsStore>> {
60        self.stores_by_provider.read().get(&provider_id).cloned()
61    }
62}