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 // TODO kb docs and project_search test
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 Setting 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 _: &gpui::AppContext,
47 ) -> anyhow::Result<Self> {
48 Self::load_via_json_merge(default_value, user_values)
49 }
50}