Revert "Fix settings2 crate tests"

This reverts commit 6e9c779c51.
This commit is contained in:
Conrad Irwin 2023-10-26 11:33:58 +02:00
parent 6e9c779c51
commit 07b9ec29e6
7 changed files with 434 additions and 405 deletions

3
Cargo.lock generated
View file

@ -4248,7 +4248,7 @@ dependencies = [
"collections", "collections",
"ctor", "ctor",
"env_logger 0.9.3", "env_logger 0.9.3",
"fs2", "fs",
"futures 0.3.28", "futures 0.3.28",
"fuzzy2", "fuzzy2",
"git", "git",
@ -7515,7 +7515,6 @@ dependencies = [
"collections", "collections",
"feature_flags2", "feature_flags2",
"fs", "fs",
"fs2",
"futures 0.3.28", "futures 0.3.28",
"gpui2", "gpui2",
"indoc", "indoc",

View file

@ -25,7 +25,7 @@ test-support = [
clock = { path = "../clock" } clock = { path = "../clock" }
collections = { path = "../collections" } collections = { path = "../collections" }
fuzzy2 = { path = "../fuzzy2" } fuzzy2 = { path = "../fuzzy2" }
fs2 = { path = "../fs2" } fs = { path = "../fs" }
git = { path = "../git" } git = { path = "../git" }
gpui2 = { path = "../gpui2" } gpui2 = { path = "../gpui2" }
lsp2 = { path = "../lsp2" } lsp2 = { path = "../lsp2" }

View file

@ -15,7 +15,7 @@ test-support = ["gpui2/test-support", "fs/test-support"]
collections = { path = "../collections" } collections = { path = "../collections" }
gpui2 = { path = "../gpui2" } gpui2 = { path = "../gpui2" }
sqlez = { path = "../sqlez" } sqlez = { path = "../sqlez" }
fs2 = { path = "../fs2" } fs = { path = "../fs" }
feature_flags2 = { path = "../feature_flags2" } feature_flags2 = { path = "../feature_flags2" }
util = { path = "../util" } util = { path = "../util" }

View file

@ -1,6 +1,6 @@
use crate::{settings_store::SettingsStore, Settings}; use crate::{settings_store::SettingsStore, Settings};
use anyhow::Result; use anyhow::Result;
use fs2::Fs; use fs::Fs;
use futures::{channel::mpsc, StreamExt}; use futures::{channel::mpsc, StreamExt};
use gpui2::{AppContext, Executor}; use gpui2::{AppContext, Executor};
use std::{io::ErrorKind, path::PathBuf, str, sync::Arc, time::Duration}; use std::{io::ErrorKind, path::PathBuf, str, sync::Arc, time::Duration};

View file

@ -35,7 +35,7 @@ pub trait Settings: 'static + Send + Sync {
fn load( fn load(
default_value: &Self::FileContent, default_value: &Self::FileContent,
user_values: &[&Self::FileContent], user_values: &[&Self::FileContent],
cx: &AppContext, cx: &mut AppContext,
) -> Result<Self> ) -> Result<Self>
where where
Self: Sized; Self: Sized;
@ -76,6 +76,36 @@ pub trait Settings: 'static + Send + Sync {
fn missing_default() -> anyhow::Error { fn missing_default() -> anyhow::Error {
anyhow::anyhow!("missing default") anyhow::anyhow!("missing default")
} }
fn register(cx: &mut AppContext)
where
Self: Sized,
{
cx.update_global(|store: &mut SettingsStore, cx| {
store.register_setting::<Self>(cx);
});
}
fn get<'a>(path: Option<(usize, &Path)>, cx: &'a AppContext) -> &'a Self
where
Self: Sized,
{
cx.global::<SettingsStore>().get(path)
}
fn get_global<'a>(cx: &'a AppContext) -> &'a Self
where
Self: Sized,
{
cx.global::<SettingsStore>().get(None)
}
fn override_global<'a>(settings: Self, cx: &'a mut AppContext)
where
Self: Sized,
{
cx.global_mut::<SettingsStore>().override_global(settings)
}
} }
pub struct SettingsJsonSchemaParams<'a> { pub struct SettingsJsonSchemaParams<'a> {
@ -121,7 +151,7 @@ trait AnySettingValue: 'static + Send + Sync {
&self, &self,
default_value: &DeserializedSetting, default_value: &DeserializedSetting,
custom: &[DeserializedSetting], custom: &[DeserializedSetting],
cx: &AppContext, cx: &mut AppContext,
) -> Result<Box<dyn Any>>; ) -> Result<Box<dyn Any>>;
fn value_for_path(&self, path: Option<(usize, &Path)>) -> &dyn Any; fn value_for_path(&self, path: Option<(usize, &Path)>) -> &dyn Any;
fn set_global_value(&mut self, value: Box<dyn Any>); fn set_global_value(&mut self, value: Box<dyn Any>);
@ -138,7 +168,7 @@ struct DeserializedSetting(Box<dyn Any>);
impl SettingsStore { impl SettingsStore {
/// Add a new type of setting to the store. /// Add a new type of setting to the store.
pub fn register_setting<T: Settings>(&mut self, cx: &AppContext) { pub fn register_setting<T: Settings>(&mut self, cx: &mut AppContext) {
let setting_type_id = TypeId::of::<T>(); let setting_type_id = TypeId::of::<T>();
let entry = self.setting_values.entry(setting_type_id); let entry = self.setting_values.entry(setting_type_id);
if matches!(entry, hash_map::Entry::Occupied(_)) { if matches!(entry, hash_map::Entry::Occupied(_)) {
@ -205,7 +235,7 @@ impl SettingsStore {
} }
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
pub fn test(cx: &AppContext) -> Self { pub fn test(cx: &mut AppContext) -> Self {
let mut this = Self::default(); let mut this = Self::default();
this.set_default_settings(&crate::test_settings(), cx) this.set_default_settings(&crate::test_settings(), cx)
.unwrap(); .unwrap();
@ -220,7 +250,7 @@ impl SettingsStore {
#[cfg(any(test, feature = "test-support"))] #[cfg(any(test, feature = "test-support"))]
pub fn update_user_settings<T: Settings>( pub fn update_user_settings<T: Settings>(
&mut self, &mut self,
cx: &AppContext, cx: &mut AppContext,
update: impl FnOnce(&mut T::FileContent), update: impl FnOnce(&mut T::FileContent),
) { ) {
let old_text = serde_json::to_string(&self.raw_user_settings).unwrap(); let old_text = serde_json::to_string(&self.raw_user_settings).unwrap();
@ -317,7 +347,7 @@ impl SettingsStore {
pub fn set_default_settings( pub fn set_default_settings(
&mut self, &mut self,
default_settings_content: &str, default_settings_content: &str,
cx: &AppContext, cx: &mut AppContext,
) -> Result<()> { ) -> Result<()> {
let settings: serde_json::Value = parse_json_with_comments(default_settings_content)?; let settings: serde_json::Value = parse_json_with_comments(default_settings_content)?;
if settings.is_object() { if settings.is_object() {
@ -333,7 +363,7 @@ impl SettingsStore {
pub fn set_user_settings( pub fn set_user_settings(
&mut self, &mut self,
user_settings_content: &str, user_settings_content: &str,
cx: &AppContext, cx: &mut AppContext,
) -> Result<()> { ) -> Result<()> {
let settings: serde_json::Value = parse_json_with_comments(user_settings_content)?; let settings: serde_json::Value = parse_json_with_comments(user_settings_content)?;
if settings.is_object() { if settings.is_object() {
@ -351,7 +381,7 @@ impl SettingsStore {
root_id: usize, root_id: usize,
path: Arc<Path>, path: Arc<Path>,
settings_content: Option<&str>, settings_content: Option<&str>,
cx: &AppContext, cx: &mut AppContext,
) -> Result<()> { ) -> Result<()> {
if let Some(content) = settings_content { if let Some(content) = settings_content {
self.raw_local_settings self.raw_local_settings
@ -364,7 +394,7 @@ impl SettingsStore {
} }
/// Add or remove a set of local settings via a JSON string. /// Add or remove a set of local settings via a JSON string.
pub fn clear_local_settings(&mut self, root_id: usize, cx: &AppContext) -> Result<()> { pub fn clear_local_settings(&mut self, root_id: usize, cx: &mut AppContext) -> Result<()> {
self.raw_local_settings.retain(|k, _| k.0 != root_id); self.raw_local_settings.retain(|k, _| k.0 != root_id);
self.recompute_values(Some((root_id, "".as_ref())), cx)?; self.recompute_values(Some((root_id, "".as_ref())), cx)?;
Ok(()) Ok(())
@ -456,7 +486,7 @@ impl SettingsStore {
fn recompute_values( fn recompute_values(
&mut self, &mut self,
changed_local_path: Option<(usize, &Path)>, changed_local_path: Option<(usize, &Path)>,
cx: &AppContext, cx: &mut AppContext,
) -> Result<()> { ) -> Result<()> {
// Reload the global and local values for every setting. // Reload the global and local values for every setting.
let mut user_settings_stack = Vec::<DeserializedSetting>::new(); let mut user_settings_stack = Vec::<DeserializedSetting>::new();
@ -557,7 +587,7 @@ impl<T: Settings> AnySettingValue for SettingValue<T> {
&self, &self,
default_value: &DeserializedSetting, default_value: &DeserializedSetting,
user_values: &[DeserializedSetting], user_values: &[DeserializedSetting],
cx: &AppContext, cx: &mut AppContext,
) -> Result<Box<dyn Any>> { ) -> Result<Box<dyn Any>> {
let default_value = default_value.0.downcast_ref::<T::FileContent>().unwrap(); let default_value = default_value.0.downcast_ref::<T::FileContent>().unwrap();
let values: SmallVec<[&T::FileContent; 6]> = user_values let values: SmallVec<[&T::FileContent; 6]> = user_values
@ -841,432 +871,431 @@ pub fn parse_json_with_comments<T: DeserializeOwned>(content: &str) -> Result<T>
Ok(serde_json_lenient::from_str(content)?) Ok(serde_json_lenient::from_str(content)?)
} }
#[cfg(test)] // #[cfg(test)]
mod tests { // mod tests {
use super::*; // use super::*;
use serde_derive::Deserialize; // use serde_derive::Deserialize;
use unindent::Unindent; // use unindent::Unindent;
#[gpui2::test] // #[gpui::test]
fn test_settings_store_basic(cx: &mut AppContext) { // fn test_settings_store_basic(cx: &mut AppContext) {
let mut store = SettingsStore::default(); // let mut store = SettingsStore::default();
store.register_setting::<UserSettings>(cx); // store.register_setting::<UserSettings>(cx);
store.register_setting::<TurboSetting>(cx); // store.register_setting::<TurboSetting>(cx);
store.register_setting::<MultiKeySettings>(cx); // store.register_setting::<MultiKeySettings>(cx);
store // store
.set_default_settings( // .set_default_settings(
r#"{ // r#"{
"turbo": false, // "turbo": false,
"user": { // "user": {
"name": "John Doe", // "name": "John Doe",
"age": 30, // "age": 30,
"staff": false // "staff": false
} // }
}"#, // }"#,
cx, // cx,
) // )
.unwrap(); // .unwrap();
assert_eq!(store.get::<TurboSetting>(None), &TurboSetting(false)); // assert_eq!(store.get::<TurboSetting>(None), &TurboSetting(false));
assert_eq!( // assert_eq!(
store.get::<UserSettings>(None), // store.get::<UserSettings>(None),
&UserSettings { // &UserSettings {
name: "John Doe".to_string(), // name: "John Doe".to_string(),
age: 30, // age: 30,
staff: false, // staff: false,
} // }
); // );
assert_eq!( // assert_eq!(
store.get::<MultiKeySettings>(None), // store.get::<MultiKeySettings>(None),
&MultiKeySettings { // &MultiKeySettings {
key1: String::new(), // key1: String::new(),
key2: String::new(), // key2: String::new(),
} // }
); // );
store // store
.set_user_settings( // .set_user_settings(
r#"{ // r#"{
"turbo": true, // "turbo": true,
"user": { "age": 31 }, // "user": { "age": 31 },
"key1": "a" // "key1": "a"
}"#, // }"#,
cx, // cx,
) // )
.unwrap(); // .unwrap();
assert_eq!(store.get::<TurboSetting>(None), &TurboSetting(true)); // assert_eq!(store.get::<TurboSetting>(None), &TurboSetting(true));
assert_eq!( // assert_eq!(
store.get::<UserSettings>(None), // store.get::<UserSettings>(None),
&UserSettings { // &UserSettings {
name: "John Doe".to_string(), // name: "John Doe".to_string(),
age: 31, // age: 31,
staff: false // staff: false
} // }
); // );
store // store
.set_local_settings( // .set_local_settings(
1, // 1,
Path::new("/root1").into(), // Path::new("/root1").into(),
Some(r#"{ "user": { "staff": true } }"#), // Some(r#"{ "user": { "staff": true } }"#),
cx, // cx,
) // )
.unwrap(); // .unwrap();
store // store
.set_local_settings( // .set_local_settings(
1, // 1,
Path::new("/root1/subdir").into(), // Path::new("/root1/subdir").into(),
Some(r#"{ "user": { "name": "Jane Doe" } }"#), // Some(r#"{ "user": { "name": "Jane Doe" } }"#),
cx, // cx,
) // )
.unwrap(); // .unwrap();
store // store
.set_local_settings( // .set_local_settings(
1, // 1,
Path::new("/root2").into(), // Path::new("/root2").into(),
Some(r#"{ "user": { "age": 42 }, "key2": "b" }"#), // Some(r#"{ "user": { "age": 42 }, "key2": "b" }"#),
cx, // cx,
) // )
.unwrap(); // .unwrap();
assert_eq!( // assert_eq!(
store.get::<UserSettings>(Some((1, Path::new("/root1/something")))), // store.get::<UserSettings>(Some((1, Path::new("/root1/something")))),
&UserSettings { // &UserSettings {
name: "John Doe".to_string(), // name: "John Doe".to_string(),
age: 31, // age: 31,
staff: true // staff: true
} // }
); // );
assert_eq!( // assert_eq!(
store.get::<UserSettings>(Some((1, Path::new("/root1/subdir/something")))), // store.get::<UserSettings>(Some((1, Path::new("/root1/subdir/something")))),
&UserSettings { // &UserSettings {
name: "Jane Doe".to_string(), // name: "Jane Doe".to_string(),
age: 31, // age: 31,
staff: true // staff: true
} // }
); // );
assert_eq!( // assert_eq!(
store.get::<UserSettings>(Some((1, Path::new("/root2/something")))), // store.get::<UserSettings>(Some((1, Path::new("/root2/something")))),
&UserSettings { // &UserSettings {
name: "John Doe".to_string(), // name: "John Doe".to_string(),
age: 42, // age: 42,
staff: false // staff: false
} // }
); // );
assert_eq!( // assert_eq!(
store.get::<MultiKeySettings>(Some((1, Path::new("/root2/something")))), // store.get::<MultiKeySettings>(Some((1, Path::new("/root2/something")))),
&MultiKeySettings { // &MultiKeySettings {
key1: "a".to_string(), // key1: "a".to_string(),
key2: "b".to_string(), // key2: "b".to_string(),
} // }
); // );
} // }
#[gpui2::test] // #[gpui::test]
fn test_setting_store_assign_json_before_register(cx: &mut AppContext) { // fn test_setting_store_assign_json_before_register(cx: &mut AppContext) {
let mut store = SettingsStore::default(); // let mut store = SettingsStore::default();
store // store
.set_default_settings( // .set_default_settings(
r#"{ // r#"{
"turbo": true, // "turbo": true,
"user": { // "user": {
"name": "John Doe", // "name": "John Doe",
"age": 30, // "age": 30,
"staff": false // "staff": false
}, // },
"key1": "x" // "key1": "x"
}"#, // }"#,
cx, // cx,
) // )
.unwrap(); // .unwrap();
store // store
.set_user_settings(r#"{ "turbo": false }"#, cx) // .set_user_settings(r#"{ "turbo": false }"#, cx)
.unwrap(); // .unwrap();
store.register_setting::<UserSettings>(cx); // store.register_setting::<UserSettings>(cx);
store.register_setting::<TurboSetting>(cx); // store.register_setting::<TurboSetting>(cx);
assert_eq!(store.get::<TurboSetting>(None), &TurboSetting(false)); // assert_eq!(store.get::<TurboSetting>(None), &TurboSetting(false));
assert_eq!( // assert_eq!(
store.get::<UserSettings>(None), // store.get::<UserSettings>(None),
&UserSettings { // &UserSettings {
name: "John Doe".to_string(), // name: "John Doe".to_string(),
age: 30, // age: 30,
staff: false, // staff: false,
} // }
); // );
store.register_setting::<MultiKeySettings>(cx); // store.register_setting::<MultiKeySettings>(cx);
assert_eq!( // assert_eq!(
store.get::<MultiKeySettings>(None), // store.get::<MultiKeySettings>(None),
&MultiKeySettings { // &MultiKeySettings {
key1: "x".into(), // key1: "x".into(),
key2: String::new(), // key2: String::new(),
} // }
); // );
} // }
#[gpui2::test] // #[gpui::test]
fn test_setting_store_update(cx: &mut AppContext) { // fn test_setting_store_update(cx: &mut AppContext) {
let mut store = SettingsStore::default(); // let mut store = SettingsStore::default();
store.register_setting::<MultiKeySettings>(cx); // store.register_setting::<MultiKeySettings>(cx);
store.register_setting::<UserSettings>(cx); // store.register_setting::<UserSettings>(cx);
store.register_setting::<LanguageSettings>(cx); // store.register_setting::<LanguageSettings>(cx);
// entries added and updated // // entries added and updated
check_settings_update::<LanguageSettings>( // check_settings_update::<LanguageSettings>(
&mut store, // &mut store,
r#"{ // r#"{
"languages": { // "languages": {
"JSON": { // "JSON": {
"language_setting_1": true // "language_setting_1": true
} // }
} // }
}"# // }"#
.unindent(), // .unindent(),
|settings| { // |settings| {
settings // settings
.languages // .languages
.get_mut("JSON") // .get_mut("JSON")
.unwrap() // .unwrap()
.language_setting_1 = Some(false); // .language_setting_1 = Some(false);
settings.languages.insert( // settings.languages.insert(
"Rust".into(), // "Rust".into(),
LanguageSettingEntry { // LanguageSettingEntry {
language_setting_2: Some(true), // language_setting_2: Some(true),
..Default::default() // ..Default::default()
}, // },
); // );
}, // },
r#"{ // r#"{
"languages": { // "languages": {
"Rust": { // "Rust": {
"language_setting_2": true // "language_setting_2": true
}, // },
"JSON": { // "JSON": {
"language_setting_1": false // "language_setting_1": false
} // }
} // }
}"# // }"#
.unindent(), // .unindent(),
cx, // cx,
); // );
// weird formatting // // weird formatting
check_settings_update::<UserSettings>( // check_settings_update::<UserSettings>(
&mut store, // &mut store,
r#"{ // r#"{
"user": { "age": 36, "name": "Max", "staff": true } // "user": { "age": 36, "name": "Max", "staff": true }
}"# // }"#
.unindent(), // .unindent(),
|settings| settings.age = Some(37), // |settings| settings.age = Some(37),
r#"{ // r#"{
"user": { "age": 37, "name": "Max", "staff": true } // "user": { "age": 37, "name": "Max", "staff": true }
}"# // }"#
.unindent(), // .unindent(),
cx, // cx,
); // );
// single-line formatting, other keys // // single-line formatting, other keys
check_settings_update::<MultiKeySettings>( // check_settings_update::<MultiKeySettings>(
&mut store, // &mut store,
r#"{ "one": 1, "two": 2 }"#.unindent(), // r#"{ "one": 1, "two": 2 }"#.unindent(),
|settings| settings.key1 = Some("x".into()), // |settings| settings.key1 = Some("x".into()),
r#"{ "key1": "x", "one": 1, "two": 2 }"#.unindent(), // r#"{ "key1": "x", "one": 1, "two": 2 }"#.unindent(),
cx, // cx,
); // );
// empty object // // empty object
check_settings_update::<UserSettings>( // check_settings_update::<UserSettings>(
&mut store, // &mut store,
r#"{ // r#"{
"user": {} // "user": {}
}"# // }"#
.unindent(), // .unindent(),
|settings| settings.age = Some(37), // |settings| settings.age = Some(37),
r#"{ // r#"{
"user": { // "user": {
"age": 37 // "age": 37
} // }
}"# // }"#
.unindent(), // .unindent(),
cx, // cx,
); // );
// no content // // no content
check_settings_update::<UserSettings>( // check_settings_update::<UserSettings>(
&mut store, // &mut store,
r#""#.unindent(), // r#""#.unindent(),
|settings| settings.age = Some(37), // |settings| settings.age = Some(37),
r#"{ // r#"{
"user": { // "user": {
"age": 37 // "age": 37
} // }
} // }
"# // "#
.unindent(), // .unindent(),
cx, // cx,
); // );
check_settings_update::<UserSettings>( // check_settings_update::<UserSettings>(
&mut store, // &mut store,
r#"{ // r#"{
} // }
"# // "#
.unindent(), // .unindent(),
|settings| settings.age = Some(37), // |settings| settings.age = Some(37),
r#"{ // r#"{
"user": { // "user": {
"age": 37 // "age": 37
} // }
} // }
"# // "#
.unindent(), // .unindent(),
cx, // cx,
); // );
} // }
#[track_caller] // fn check_settings_update<T: Setting>(
fn check_settings_update<T: Settings>( // store: &mut SettingsStore,
store: &mut SettingsStore, // old_json: String,
old_json: String, // update: fn(&mut T::FileContent),
update: fn(&mut T::FileContent), // expected_new_json: String,
expected_new_json: String, // cx: &mut AppContext,
cx: &mut AppContext, // ) {
) { // store.set_user_settings(&old_json, cx).ok();
store.set_user_settings(&old_json, cx).ok(); // let edits = store.edits_for_update::<T>(&old_json, update);
let edits = store.edits_for_update::<T>(&old_json, update); // let mut new_json = old_json;
let mut new_json = old_json; // for (range, replacement) in edits.into_iter() {
for (range, replacement) in edits.into_iter() { // new_json.replace_range(range, &replacement);
new_json.replace_range(range, &replacement); // }
} // pretty_assertions::assert_eq!(new_json, expected_new_json);
pretty_assertions::assert_eq!(new_json, expected_new_json); // }
}
#[derive(Debug, PartialEq, Deserialize)] // #[derive(Debug, PartialEq, Deserialize)]
struct UserSettings { // struct UserSettings {
name: String, // name: String,
age: u32, // age: u32,
staff: bool, // staff: bool,
} // }
#[derive(Default, Clone, Serialize, Deserialize, JsonSchema)] // #[derive(Default, Clone, Serialize, Deserialize, JsonSchema)]
struct UserSettingsJson { // struct UserSettingsJson {
name: Option<String>, // name: Option<String>,
age: Option<u32>, // age: Option<u32>,
staff: Option<bool>, // staff: Option<bool>,
} // }
impl Settings for UserSettings { // impl Setting for UserSettings {
const KEY: Option<&'static str> = Some("user"); // const KEY: Option<&'static str> = Some("user");
type FileContent = UserSettingsJson; // type FileContent = UserSettingsJson;
fn load( // fn load(
default_value: &UserSettingsJson, // default_value: &UserSettingsJson,
user_values: &[&UserSettingsJson], // user_values: &[&UserSettingsJson],
_: &AppContext, // _: &AppContext,
) -> Result<Self> { // ) -> Result<Self> {
Self::load_via_json_merge(default_value, user_values) // Self::load_via_json_merge(default_value, user_values)
} // }
} // }
#[derive(Debug, Deserialize, PartialEq)] // #[derive(Debug, Deserialize, PartialEq)]
struct TurboSetting(bool); // struct TurboSetting(bool);
impl Settings for TurboSetting { // impl Setting for TurboSetting {
const KEY: Option<&'static str> = Some("turbo"); // const KEY: Option<&'static str> = Some("turbo");
type FileContent = Option<bool>; // type FileContent = Option<bool>;
fn load( // fn load(
default_value: &Option<bool>, // default_value: &Option<bool>,
user_values: &[&Option<bool>], // user_values: &[&Option<bool>],
_: &AppContext, // _: &AppContext,
) -> Result<Self> { // ) -> Result<Self> {
Self::load_via_json_merge(default_value, user_values) // Self::load_via_json_merge(default_value, user_values)
} // }
} // }
#[derive(Clone, Debug, PartialEq, Deserialize)] // #[derive(Clone, Debug, PartialEq, Deserialize)]
struct MultiKeySettings { // struct MultiKeySettings {
#[serde(default)] // #[serde(default)]
key1: String, // key1: String,
#[serde(default)] // #[serde(default)]
key2: String, // key2: String,
} // }
#[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] // #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)]
struct MultiKeySettingsJson { // struct MultiKeySettingsJson {
key1: Option<String>, // key1: Option<String>,
key2: Option<String>, // key2: Option<String>,
} // }
impl Settings for MultiKeySettings { // impl Setting for MultiKeySettings {
const KEY: Option<&'static str> = None; // const KEY: Option<&'static str> = None;
type FileContent = MultiKeySettingsJson; // type FileContent = MultiKeySettingsJson;
fn load( // fn load(
default_value: &MultiKeySettingsJson, // default_value: &MultiKeySettingsJson,
user_values: &[&MultiKeySettingsJson], // user_values: &[&MultiKeySettingsJson],
_: &AppContext, // _: &AppContext,
) -> Result<Self> { // ) -> Result<Self> {
Self::load_via_json_merge(default_value, user_values) // Self::load_via_json_merge(default_value, user_values)
} // }
} // }
#[derive(Debug, Deserialize)] // #[derive(Debug, Deserialize)]
struct JournalSettings { // struct JournalSettings {
pub path: String, // pub path: String,
pub hour_format: HourFormat, // pub hour_format: HourFormat,
} // }
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)] // #[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")] // #[serde(rename_all = "snake_case")]
enum HourFormat { // enum HourFormat {
Hour12, // Hour12,
Hour24, // Hour24,
} // }
#[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema)] // #[derive(Clone, Default, Debug, Serialize, Deserialize, JsonSchema)]
struct JournalSettingsJson { // struct JournalSettingsJson {
pub path: Option<String>, // pub path: Option<String>,
pub hour_format: Option<HourFormat>, // pub hour_format: Option<HourFormat>,
} // }
impl Settings for JournalSettings { // impl Setting for JournalSettings {
const KEY: Option<&'static str> = Some("journal"); // const KEY: Option<&'static str> = Some("journal");
type FileContent = JournalSettingsJson; // type FileContent = JournalSettingsJson;
fn load( // fn load(
default_value: &JournalSettingsJson, // default_value: &JournalSettingsJson,
user_values: &[&JournalSettingsJson], // user_values: &[&JournalSettingsJson],
_: &AppContext, // _: &AppContext,
) -> Result<Self> { // ) -> Result<Self> {
Self::load_via_json_merge(default_value, user_values) // Self::load_via_json_merge(default_value, user_values)
} // }
} // }
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] // #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
struct LanguageSettings { // struct LanguageSettings {
#[serde(default)] // #[serde(default)]
languages: HashMap<String, LanguageSettingEntry>, // languages: HashMap<String, LanguageSettingEntry>,
} // }
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)] // #[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
struct LanguageSettingEntry { // struct LanguageSettingEntry {
language_setting_1: Option<bool>, // language_setting_1: Option<bool>,
language_setting_2: Option<bool>, // language_setting_2: Option<bool>,
} // }
impl Settings for LanguageSettings { // impl Setting for LanguageSettings {
const KEY: Option<&'static str> = None; // const KEY: Option<&'static str> = None;
type FileContent = Self; // type FileContent = Self;
fn load(default_value: &Self, user_values: &[&Self], _: &AppContext) -> Result<Self> { // fn load(default_value: &Self, user_values: &[&Self], _: &AppContext) -> Result<Self> {
Self::load_via_json_merge(default_value, user_values) // Self::load_via_json_merge(default_value, user_values)
} // }
} // }
} // }

View file

@ -8,7 +8,7 @@ use schemars::{
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use serde_json::Value; use serde_json::Value;
use settings2::SettingsJsonSchemaParams; use settings2::{Settings, SettingsJsonSchemaParams};
use std::sync::Arc; use std::sync::Arc;
use util::ResultExt as _; use util::ResultExt as _;

View file

@ -6,6 +6,7 @@ pub use registry::*;
pub use settings::*; pub use settings::*;
use gpui2::{AppContext, HighlightStyle, Hsla, SharedString}; use gpui2::{AppContext, HighlightStyle, Hsla, SharedString};
use settings2::Settings;
use std::sync::Arc; use std::sync::Arc;
pub fn init(cx: &mut AppContext) { pub fn init(cx: &mut AppContext) {