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("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}