1use std::path::PathBuf;
2use std::sync::Arc;
3
4use anyhow::Result;
5use async_trait::async_trait;
6use extension::{Extension, ExtensionHostProxy, ExtensionIndexedDocsProviderProxy};
7use gpui::App;
8
9use crate::{
10 IndexedDocsDatabase, IndexedDocsProvider, IndexedDocsRegistry, PackageName, ProviderId,
11};
12
13pub fn init(cx: &mut App) {
14 let proxy = ExtensionHostProxy::default_global(cx);
15 proxy.register_indexed_docs_provider_proxy(IndexedDocsRegistryProxy {
16 indexed_docs_registry: IndexedDocsRegistry::global(cx),
17 });
18}
19
20struct IndexedDocsRegistryProxy {
21 indexed_docs_registry: Arc<IndexedDocsRegistry>,
22}
23
24impl ExtensionIndexedDocsProviderProxy for IndexedDocsRegistryProxy {
25 fn register_indexed_docs_provider(&self, extension: Arc<dyn Extension>, provider_id: Arc<str>) {
26 self.indexed_docs_registry
27 .register_provider(Box::new(ExtensionIndexedDocsProvider::new(
28 extension,
29 ProviderId(provider_id),
30 )));
31 }
32}
33
34pub struct ExtensionIndexedDocsProvider {
35 extension: Arc<dyn Extension>,
36 id: ProviderId,
37}
38
39impl ExtensionIndexedDocsProvider {
40 pub fn new(extension: Arc<dyn Extension>, id: ProviderId) -> Self {
41 Self { extension, id }
42 }
43}
44
45#[async_trait]
46impl IndexedDocsProvider for ExtensionIndexedDocsProvider {
47 fn id(&self) -> ProviderId {
48 self.id.clone()
49 }
50
51 fn database_path(&self) -> PathBuf {
52 let mut database_path = PathBuf::from(self.extension.work_dir().as_ref());
53 database_path.push("docs");
54 database_path.push(format!("{}.0.mdb", self.id));
55
56 database_path
57 }
58
59 async fn suggest_packages(&self) -> Result<Vec<PackageName>> {
60 let packages = self
61 .extension
62 .suggest_docs_packages(self.id.0.clone())
63 .await?;
64
65 Ok(packages
66 .into_iter()
67 .map(|package| PackageName::from(package.as_str()))
68 .collect())
69 }
70
71 async fn index(&self, package: PackageName, database: Arc<IndexedDocsDatabase>) -> Result<()> {
72 self.extension
73 .index_docs(self.id.0.clone(), package.as_ref().into(), database)
74 .await
75 }
76}