collab: Add the ability to filter extensions by what they provide (#24315)
This PR adds the ability to filter extension results from the extension API by the features that they provide. For instance, to filter down just to extensions that provide icon themes: ``` https://api.zed.dev/extensions?provides=icon-themes ``` Release Notes: - N/A
This commit is contained in:
parent
c0dd7e8367
commit
e1919b4121
4 changed files with 85 additions and 11 deletions
|
@ -9,10 +9,11 @@ use axum::{
|
|||
routing::get,
|
||||
Extension, Json, Router,
|
||||
};
|
||||
use collections::HashMap;
|
||||
use rpc::{ExtensionApiManifest, GetExtensionsResponse};
|
||||
use collections::{BTreeSet, HashMap};
|
||||
use rpc::{ExtensionApiManifest, ExtensionProvides, GetExtensionsResponse};
|
||||
use semantic_version::SemanticVersion;
|
||||
use serde::Deserialize;
|
||||
use std::str::FromStr;
|
||||
use std::{sync::Arc, time::Duration};
|
||||
use time::PrimitiveDateTime;
|
||||
use util::{maybe, ResultExt};
|
||||
|
@ -35,6 +36,14 @@ pub fn router() -> Router {
|
|||
#[derive(Debug, Deserialize)]
|
||||
struct GetExtensionsParams {
|
||||
filter: Option<String>,
|
||||
/// A comma-delimited list of features that the extension must provide.
|
||||
///
|
||||
/// For example:
|
||||
/// - `themes`
|
||||
/// - `themes,icon-themes`
|
||||
/// - `languages,language-servers`
|
||||
#[serde(default)]
|
||||
provides: Option<String>,
|
||||
#[serde(default)]
|
||||
max_schema_version: i32,
|
||||
}
|
||||
|
@ -43,9 +52,22 @@ async fn get_extensions(
|
|||
Extension(app): Extension<Arc<AppState>>,
|
||||
Query(params): Query<GetExtensionsParams>,
|
||||
) -> Result<Json<GetExtensionsResponse>> {
|
||||
let provides_filter = params.provides.map(|provides| {
|
||||
provides
|
||||
.split(',')
|
||||
.map(|value| value.trim())
|
||||
.filter_map(|value| ExtensionProvides::from_str(value).ok())
|
||||
.collect::<BTreeSet<_>>()
|
||||
});
|
||||
|
||||
let mut extensions = app
|
||||
.db
|
||||
.get_extensions(params.filter.as_deref(), params.max_schema_version, 500)
|
||||
.get_extensions(
|
||||
params.filter.as_deref(),
|
||||
provides_filter.as_ref(),
|
||||
params.max_schema_version,
|
||||
500,
|
||||
)
|
||||
.await?;
|
||||
|
||||
if let Some(filter) = params.filter.as_deref() {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue