extension_indexed_docs_provider.rs

 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}