Allow extensions to suggest packages for /docs
completions (#16185)
This PR gives extensions the ability to suggest packages to show up in `/docs` completions by default. Release Notes: - N/A
This commit is contained in:
parent
c6a1d9aa33
commit
aa12ae0e3c
5 changed files with 64 additions and 1 deletions
|
@ -31,7 +31,25 @@ impl IndexedDocsProvider for ExtensionIndexedDocsProvider {
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn suggest_packages(&self) -> Result<Vec<PackageName>> {
|
async fn suggest_packages(&self) -> Result<Vec<PackageName>> {
|
||||||
Ok(Vec::new())
|
self.extension
|
||||||
|
.call({
|
||||||
|
let id = self.id.clone();
|
||||||
|
|extension, store| {
|
||||||
|
async move {
|
||||||
|
let packages = extension
|
||||||
|
.call_suggest_docs_packages(store, id.as_ref())
|
||||||
|
.await?
|
||||||
|
.map_err(|err| anyhow!("{err:?}"))?;
|
||||||
|
|
||||||
|
Ok(packages
|
||||||
|
.into_iter()
|
||||||
|
.map(|package| PackageName::from(package.as_str()))
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
|
.boxed()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.await
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn index(&self, package: PackageName, database: Arc<IndexedDocsDatabase>) -> Result<()> {
|
async fn index(&self, package: PackageName, database: Arc<IndexedDocsDatabase>) -> Result<()> {
|
||||||
|
|
|
@ -291,6 +291,19 @@ impl Extension {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn call_suggest_docs_packages(
|
||||||
|
&self,
|
||||||
|
store: &mut Store<WasmState>,
|
||||||
|
provider: &str,
|
||||||
|
) -> Result<Result<Vec<String>, String>> {
|
||||||
|
match self {
|
||||||
|
Extension::V010(ext) => ext.call_suggest_docs_packages(store, provider).await,
|
||||||
|
Extension::V001(_) | Extension::V004(_) | Extension::V006(_) => Err(anyhow!(
|
||||||
|
"`suggest_docs_packages` not available prior to v0.1.0"
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn call_index_docs(
|
pub async fn call_index_docs(
|
||||||
&self,
|
&self,
|
||||||
store: &mut Store<WasmState>,
|
store: &mut Store<WasmState>,
|
||||||
|
|
|
@ -129,6 +129,16 @@ pub trait Extension: Send + Sync {
|
||||||
Err("`run_slash_command` not implemented".to_string())
|
Err("`run_slash_command` not implemented".to_string())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a list of package names as suggestions to be included in the
|
||||||
|
/// search results of the `/docs` slash command.
|
||||||
|
///
|
||||||
|
/// This can be used to provide completions for known packages (e.g., from the
|
||||||
|
/// local project or a registry) before a package has been indexed.
|
||||||
|
fn suggest_docs_packages(&self, _provider: String) -> Result<Vec<String>, String> {
|
||||||
|
Ok(Vec::new())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Indexes the docs for the specified package.
|
||||||
fn index_docs(
|
fn index_docs(
|
||||||
&self,
|
&self,
|
||||||
_provider: String,
|
_provider: String,
|
||||||
|
@ -260,6 +270,10 @@ impl wit::Guest for Component {
|
||||||
extension().run_slash_command(command, argument, worktree)
|
extension().run_slash_command(command, argument, worktree)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn suggest_docs_packages(provider: String) -> Result<Vec<String>, String> {
|
||||||
|
extension().suggest_docs_packages(provider)
|
||||||
|
}
|
||||||
|
|
||||||
fn index_docs(
|
fn index_docs(
|
||||||
provider: String,
|
provider: String,
|
||||||
package: String,
|
package: String,
|
||||||
|
|
|
@ -135,6 +135,13 @@ world extension {
|
||||||
/// Returns the output from running the provided slash command.
|
/// Returns the output from running the provided slash command.
|
||||||
export run-slash-command: func(command: slash-command, argument: option<string>, worktree: option<borrow<worktree>>) -> result<slash-command-output, string>;
|
export run-slash-command: func(command: slash-command, argument: option<string>, worktree: option<borrow<worktree>>) -> result<slash-command-output, string>;
|
||||||
|
|
||||||
|
/// Returns a list of packages as suggestions to be included in the `/docs`
|
||||||
|
/// search results.
|
||||||
|
///
|
||||||
|
/// This can be used to provide completions for known packages (e.g., from the
|
||||||
|
/// local project or a registry) before a package has been indexed.
|
||||||
|
export suggest-docs-packages: func(provider-name: string) -> result<list<string>, string>;
|
||||||
|
|
||||||
/// Indexes the docs for the specified package.
|
/// Indexes the docs for the specified package.
|
||||||
export index-docs: func(provider-name: string, package-name: string, database: borrow<key-value-store>) -> result<_, string>;
|
export index-docs: func(provider-name: string, package-name: string, database: borrow<key-value-store>) -> result<_, string>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,6 +246,17 @@ impl zed::Extension for GleamExtension {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn suggest_docs_packages(&self, provider: String) -> Result<Vec<String>, String> {
|
||||||
|
match provider.as_str() {
|
||||||
|
"gleam-hexdocs" => Ok(vec![
|
||||||
|
"gleam_stdlib".to_string(),
|
||||||
|
"birdie".to_string(),
|
||||||
|
"startest".to_string(),
|
||||||
|
]),
|
||||||
|
_ => Ok(Vec::new()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn index_docs(
|
fn index_docs(
|
||||||
&self,
|
&self,
|
||||||
provider: String,
|
provider: String,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue