1use std::collections::BTreeSet;
2use std::sync::Arc;
3
4use chrono::{DateTime, Utc};
5use serde::{Deserialize, Serialize};
6use strum::EnumString;
7
8#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
9pub struct ExtensionApiManifest {
10 pub name: String,
11 pub version: Arc<str>,
12 pub description: Option<String>,
13 pub authors: Vec<String>,
14 pub repository: String,
15 pub schema_version: Option<i32>,
16 pub wasm_api_version: Option<String>,
17 #[serde(default)]
18 pub provides: BTreeSet<ExtensionProvides>,
19}
20
21#[derive(
22 Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Serialize, Deserialize, EnumString,
23)]
24#[serde(rename_all = "kebab-case")]
25#[strum(serialize_all = "kebab-case")]
26pub enum ExtensionProvides {
27 Themes,
28 IconThemes,
29 Languages,
30 Grammars,
31 LanguageServers,
32 ContextServers,
33 SlashCommands,
34 IndexedDocsProviders,
35 Snippets,
36}
37
38#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
39pub struct ExtensionMetadata {
40 pub id: Arc<str>,
41 #[serde(flatten)]
42 pub manifest: ExtensionApiManifest,
43 pub published_at: DateTime<Utc>,
44 pub download_count: u64,
45}
46
47#[derive(Serialize, Deserialize)]
48pub struct GetExtensionsResponse {
49 pub data: Vec<ExtensionMetadata>,
50}