registry.rs

 1use std::sync::Arc;
 2
 3use collections::HashMap;
 4use gpui::{AppContext, 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: &AppContext) -> Arc<Self> {
20        GlobalIndexedDocsRegistry::global(cx).0.clone()
21    }
22
23    pub fn init_global(cx: &mut AppContext) {
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 register_provider(
38        &self,
39        provider: Box<dyn IndexedDocsProvider + Send + Sync + 'static>,
40    ) {
41        self.stores_by_provider.write().insert(
42            provider.id(),
43            Arc::new(IndexedDocsStore::new(provider, self.executor.clone())),
44        );
45    }
46
47    pub fn get_provider_store(&self, provider_id: ProviderId) -> Option<Arc<IndexedDocsStore>> {
48        self.stores_by_provider.read().get(&provider_id).cloned()
49    }
50}