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,
23 PartialEq,
24 Eq,
25 PartialOrd,
26 Ord,
27 Hash,
28 Clone,
29 Copy,
30 Serialize,
31 Deserialize,
32 EnumString,
33 strum::Display,
34)]
35#[serde(rename_all = "kebab-case")]
36#[strum(serialize_all = "kebab-case")]
37pub enum ExtensionProvides {
38 Themes,
39 IconThemes,
40 Languages,
41 Grammars,
42 LanguageServers,
43 ContextServers,
44 SlashCommands,
45 IndexedDocsProviders,
46 Snippets,
47}
48
49#[derive(Clone, Serialize, Deserialize, Debug, PartialEq)]
50pub struct ExtensionMetadata {
51 pub id: Arc<str>,
52 #[serde(flatten)]
53 pub manifest: ExtensionApiManifest,
54 pub published_at: DateTime<Utc>,
55 pub download_count: u64,
56}
57
58#[derive(Serialize, Deserialize)]
59pub struct GetExtensionsResponse {
60 pub data: Vec<ExtensionMetadata>,
61}