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(self.extension.manifest().id.as_ref());
30 database_path.push("docs");
31 database_path.push(format!("{}.0.mdb", self.id));
32
33 database_path
34 }
35
36 async fn suggest_packages(&self) -> Result<Vec<PackageName>> {
37 let packages = self
38 .extension
39 .suggest_docs_packages(self.id.0.clone())
40 .await?;
41
42 Ok(packages
43 .into_iter()
44 .map(|package| PackageName::from(package.as_str()))
45 .collect())
46 }
47
48 async fn index(&self, package: PackageName, database: Arc<IndexedDocsDatabase>) -> Result<()> {
49 self.extension
50 .index_docs(self.id.0.clone(), package.as_ref().into(), database)
51 .await
52 }
53}