1use std::path::PathBuf;
2use std::sync::Arc;
3
4use anyhow::Result;
5use async_trait::async_trait;
6use extension::Extension;
7
8use crate::{IndexedDocsDatabase, IndexedDocsProvider, PackageName, ProviderId};
9
10pub struct ExtensionIndexedDocsProvider {
11 extension: Arc<dyn Extension>,
12 id: ProviderId,
13}
14
15impl ExtensionIndexedDocsProvider {
16 pub fn new(extension: Arc<dyn Extension>, id: ProviderId) -> Self {
17 Self { extension, id }
18 }
19}
20
21#[async_trait]
22impl IndexedDocsProvider for ExtensionIndexedDocsProvider {
23 fn id(&self) -> ProviderId {
24 self.id.clone()
25 }
26
27 fn database_path(&self) -> PathBuf {
28 let mut database_path = PathBuf::from(self.extension.work_dir().as_ref());
29 database_path.push("docs");
30 database_path.push(format!("{}.0.mdb", self.id));
31
32 database_path
33 }
34
35 async fn suggest_packages(&self) -> Result<Vec<PackageName>> {
36 let packages = self
37 .extension
38 .suggest_docs_packages(self.id.0.clone())
39 .await?;
40
41 Ok(packages
42 .into_iter()
43 .map(|package| PackageName::from(package.as_str()))
44 .collect())
45 }
46
47 async fn index(&self, package: PackageName, database: Arc<IndexedDocsDatabase>) -> Result<()> {
48 self.extension
49 .index_docs(self.id.0.clone(), package.as_ref().into(), database)
50 .await
51 }
52}