project_settings.rs

 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 better names and docs
14    // TODO kb how to react on their changes?
15    #[serde(default)]
16    pub scan_exclude_files: Vec<String>,
17    #[serde(default)]
18    pub scan_include_files: Vec<String>,
19}
20
21#[derive(Copy, Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
22pub struct GitSettings {
23    pub git_gutter: Option<GitGutterSetting>,
24    pub gutter_debounce: Option<u64>,
25}
26
27#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, JsonSchema)]
28#[serde(rename_all = "snake_case")]
29pub enum GitGutterSetting {
30    #[default]
31    TrackedFiles,
32    Hide,
33}
34
35#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
36#[serde(rename_all = "snake_case")]
37pub struct LspSettings {
38    pub initialization_options: Option<serde_json::Value>,
39}
40
41impl Setting for ProjectSettings {
42    const KEY: Option<&'static str> = None;
43
44    type FileContent = Self;
45
46    fn load(
47        default_value: &Self::FileContent,
48        user_values: &[&Self::FileContent],
49        _: &gpui::AppContext,
50    ) -> anyhow::Result<Self> {
51        Self::load_via_json_merge(default_value, user_values)
52    }
53}