1use std::sync::Arc;
2
3use collections::HashMap;
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6use serde_with::skip_serializing_none;
7use settings_macros::MergeFrom;
8
9#[skip_serializing_none]
10#[derive(Debug, PartialEq, Clone, Default, Serialize, Deserialize, JsonSchema, MergeFrom)]
11pub struct ExtensionSettingsContent {
12 /// The extensions that should be automatically installed by Zed.
13 ///
14 /// This is used to make functionality provided by extensions (e.g., language support)
15 /// available out-of-the-box.
16 ///
17 /// Default: { "html": true }
18 #[serde(default)]
19 pub auto_install_extensions: HashMap<Arc<str>, bool>,
20 #[serde(default)]
21 pub auto_update_extensions: HashMap<Arc<str>, bool>,
22 /// The capabilities granted to extensions.
23 #[serde(default)]
24 pub granted_extension_capabilities: Option<Vec<ExtensionCapabilityContent>>,
25}
26
27/// A capability for an extension.
28#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, JsonSchema)]
29#[serde(tag = "kind", rename_all = "snake_case")]
30pub enum ExtensionCapabilityContent {
31 #[serde(rename = "process:exec")]
32 ProcessExec(ProcessExecCapabilityContent),
33 DownloadFile(DownloadFileCapabilityContent),
34 #[serde(rename = "npm:install")]
35 NpmInstallPackage(NpmInstallPackageCapabilityContent),
36}
37
38#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, JsonSchema)]
39#[serde(rename_all = "snake_case")]
40pub struct ProcessExecCapabilityContent {
41 /// The command to execute.
42 pub command: String,
43 /// The arguments to pass to the command. Use `*` for a single wildcard argument.
44 /// If the last element is `**`, then any trailing arguments are allowed.
45 pub args: Vec<String>,
46}
47
48#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, JsonSchema)]
49#[serde(rename_all = "snake_case")]
50pub struct DownloadFileCapabilityContent {
51 pub host: String,
52 pub path: Vec<String>,
53}
54
55#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize, JsonSchema)]
56#[serde(rename_all = "snake_case")]
57pub struct NpmInstallPackageCapabilityContent {
58 pub package: String,
59}