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}