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