1use collections::HashMap;
2use gpui::AppContext;
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use settings::Settings;
6use std::sync::Arc;
7
8#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
9pub struct ProjectSettings {
10 #[serde(default)]
11 pub lsp: HashMap<Arc<str>, LspSettings>,
12 #[serde(default)]
13 pub git: GitSettings,
14 #[serde(default)]
15 pub file_scan_exclusions: Option<Vec<String>>,
16}
17
18#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
19pub struct GitSettings {
20 pub git_gutter: Option<GitGutterSetting>,
21 pub gutter_debounce: Option<u64>,
22}
23
24#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema)]
25#[serde(rename_all = "snake_case")]
26pub enum GitGutterSetting {
27 #[default]
28 TrackedFiles,
29 Hide,
30}
31
32#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
33#[serde(rename_all = "snake_case")]
34pub struct LspSettings {
35 pub initialization_options: Option<serde_json::Value>,
36}
37
38impl Settings for ProjectSettings {
39 const KEY: Option<&'static str> = None;
40
41 type FileContent = Self;
42
43 fn load(
44 default_value: &Self::FileContent,
45 user_values: &[&Self::FileContent],
46 _: &mut AppContext,
47 ) -> anyhow::Result<Self> {
48 Self::load_via_json_merge(default_value, user_values)
49 }
50}