76 lines · 2.1 KB · Rust
RawDownload
use std::path::PathBuf;use std::sync::Arc; use anyhow::Result;use async_trait::async_trait;use extension::{Extension, ExtensionHostProxy, ExtensionIndexedDocsProviderProxy};use gpui::App; use crate::{    IndexedDocsDatabase, IndexedDocsProvider, IndexedDocsRegistry, PackageName, ProviderId,}; pub fn init(cx: &mut App) {    let proxy = ExtensionHostProxy::default_global(cx);    proxy.register_indexed_docs_provider_proxy(IndexedDocsRegistryProxy {        indexed_docs_registry: IndexedDocsRegistry::global(cx),    });} struct IndexedDocsRegistryProxy {    indexed_docs_registry: Arc<IndexedDocsRegistry>,} impl ExtensionIndexedDocsProviderProxy for IndexedDocsRegistryProxy {    fn register_indexed_docs_provider(&self, extension: Arc<dyn Extension>, provider_id: Arc<str>) {        self.indexed_docs_registry            .register_provider(Box::new(ExtensionIndexedDocsProvider::new(                extension,                ProviderId(provider_id),            )));    }} pub struct ExtensionIndexedDocsProvider {    extension: Arc<dyn Extension>,    id: ProviderId,} impl ExtensionIndexedDocsProvider {    pub fn new(extension: Arc<dyn Extension>, id: ProviderId) -> Self {        Self { extension, id }    }} #[async_trait]impl IndexedDocsProvider for ExtensionIndexedDocsProvider {    fn id(&self) -> ProviderId {        self.id.clone()    }     fn database_path(&self) -> PathBuf {        let mut database_path = PathBuf::from(self.extension.work_dir().as_ref());        database_path.push("docs");        database_path.push(format!("{}.0.mdb", self.id));         database_path    }     async fn suggest_packages(&self) -> Result<Vec<PackageName>> {        let packages = self            .extension            .suggest_docs_packages(self.id.0.clone())            .await?;         Ok(packages            .into_iter()            .map(|package| PackageName::from(package.as_str()))            .collect())    }     async fn index(&self, package: PackageName, database: Arc<IndexedDocsDatabase>) -> Result<()> {        self.extension            .index_docs(self.id.0.clone(), package.as_ref().into(), database)            .await    }}