Fix settings2 crate tests
This commit is contained in:
parent
6cf7d0b81c
commit
6e9c779c51
7 changed files with 405 additions and 434 deletions
3
Cargo.lock
generated
3
Cargo.lock
generated
|
@ -4248,7 +4248,7 @@ dependencies = [
|
||||||
"collections",
|
"collections",
|
||||||
"ctor",
|
"ctor",
|
||||||
"env_logger 0.9.3",
|
"env_logger 0.9.3",
|
||||||
"fs",
|
"fs2",
|
||||||
"futures 0.3.28",
|
"futures 0.3.28",
|
||||||
"fuzzy2",
|
"fuzzy2",
|
||||||
"git",
|
"git",
|
||||||
|
@ -7515,6 +7515,7 @@ dependencies = [
|
||||||
"collections",
|
"collections",
|
||||||
"feature_flags2",
|
"feature_flags2",
|
||||||
"fs",
|
"fs",
|
||||||
|
"fs2",
|
||||||
"futures 0.3.28",
|
"futures 0.3.28",
|
||||||
"gpui2",
|
"gpui2",
|
||||||
"indoc",
|
"indoc",
|
||||||
|
|
|
@ -25,7 +25,7 @@ test-support = [
|
||||||
clock = { path = "../clock" }
|
clock = { path = "../clock" }
|
||||||
collections = { path = "../collections" }
|
collections = { path = "../collections" }
|
||||||
fuzzy2 = { path = "../fuzzy2" }
|
fuzzy2 = { path = "../fuzzy2" }
|
||||||
fs = { path = "../fs" }
|
fs2 = { path = "../fs2" }
|
||||||
git = { path = "../git" }
|
git = { path = "../git" }
|
||||||
gpui2 = { path = "../gpui2" }
|
gpui2 = { path = "../gpui2" }
|
||||||
lsp2 = { path = "../lsp2" }
|
lsp2 = { path = "../lsp2" }
|
||||||
|
|
|
@ -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" }
|
||||||
fs = { path = "../fs" }
|
fs2 = { path = "../fs2" }
|
||||||
feature_flags2 = { path = "../feature_flags2" }
|
feature_flags2 = { path = "../feature_flags2" }
|
||||||
util = { path = "../util" }
|
util = { path = "../util" }
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
use crate::{settings_store::SettingsStore, Settings};
|
use crate::{settings_store::SettingsStore, Settings};
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use fs::Fs;
|
use fs2::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};
|
||||||
|
|
|
@ -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: &mut AppContext,
|
cx: &AppContext,
|
||||||
) -> Result<Self>
|
) -> Result<Self>
|
||||||
where
|
where
|
||||||
Self: Sized;
|
Self: Sized;
|
||||||
|
@ -76,36 +76,6 @@ 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> {
|
||||||
|
@ -151,7 +121,7 @@ trait AnySettingValue: 'static + Send + Sync {
|
||||||
&self,
|
&self,
|
||||||
default_value: &DeserializedSetting,
|
default_value: &DeserializedSetting,
|
||||||
custom: &[DeserializedSetting],
|
custom: &[DeserializedSetting],
|
||||||
cx: &mut AppContext,
|
cx: &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>);
|
||||||
|
@ -168,7 +138,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: &mut AppContext) {
|
pub fn register_setting<T: Settings>(&mut self, cx: &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(_)) {
|
||||||
|
@ -235,7 +205,7 @@ impl SettingsStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(any(test, feature = "test-support"))]
|
#[cfg(any(test, feature = "test-support"))]
|
||||||
pub fn test(cx: &mut AppContext) -> Self {
|
pub fn test(cx: &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();
|
||||||
|
@ -250,7 +220,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: &mut AppContext,
|
cx: &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();
|
||||||
|
@ -347,7 +317,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: &mut AppContext,
|
cx: &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() {
|
||||||
|
@ -363,7 +333,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: &mut AppContext,
|
cx: &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() {
|
||||||
|
@ -381,7 +351,7 @@ impl SettingsStore {
|
||||||
root_id: usize,
|
root_id: usize,
|
||||||
path: Arc<Path>,
|
path: Arc<Path>,
|
||||||
settings_content: Option<&str>,
|
settings_content: Option<&str>,
|
||||||
cx: &mut AppContext,
|
cx: &AppContext,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
if let Some(content) = settings_content {
|
if let Some(content) = settings_content {
|
||||||
self.raw_local_settings
|
self.raw_local_settings
|
||||||
|
@ -394,7 +364,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: &mut AppContext) -> Result<()> {
|
pub fn clear_local_settings(&mut self, root_id: usize, cx: &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(())
|
||||||
|
@ -486,7 +456,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: &mut AppContext,
|
cx: &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();
|
||||||
|
@ -587,7 +557,7 @@ impl<T: Settings> AnySettingValue for SettingValue<T> {
|
||||||
&self,
|
&self,
|
||||||
default_value: &DeserializedSetting,
|
default_value: &DeserializedSetting,
|
||||||
user_values: &[DeserializedSetting],
|
user_values: &[DeserializedSetting],
|
||||||
cx: &mut AppContext,
|
cx: &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
|
||||||
|
@ -871,431 +841,432 @@ 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;
|
||||||
|
|
||||||
// #[gpui::test]
|
#[gpui2::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(),
|
||||||
// }
|
}
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// #[gpui::test]
|
#[gpui2::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(),
|
||||||
// }
|
}
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// #[gpui::test]
|
#[gpui2::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,
|
||||||
// );
|
);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// fn check_settings_update<T: Setting>(
|
#[track_caller]
|
||||||
// store: &mut SettingsStore,
|
fn check_settings_update<T: Settings>(
|
||||||
// old_json: String,
|
store: &mut SettingsStore,
|
||||||
// update: fn(&mut T::FileContent),
|
old_json: String,
|
||||||
// expected_new_json: String,
|
update: fn(&mut T::FileContent),
|
||||||
// cx: &mut AppContext,
|
expected_new_json: String,
|
||||||
// ) {
|
cx: &mut AppContext,
|
||||||
// store.set_user_settings(&old_json, cx).ok();
|
) {
|
||||||
// let edits = store.edits_for_update::<T>(&old_json, update);
|
store.set_user_settings(&old_json, cx).ok();
|
||||||
// let mut new_json = old_json;
|
let edits = store.edits_for_update::<T>(&old_json, update);
|
||||||
// for (range, replacement) in edits.into_iter() {
|
let mut new_json = old_json;
|
||||||
// new_json.replace_range(range, &replacement);
|
for (range, replacement) in edits.into_iter() {
|
||||||
// }
|
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 Setting for UserSettings {
|
impl Settings 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 Setting for TurboSetting {
|
impl Settings 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 Setting for MultiKeySettings {
|
impl Settings 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 Setting for JournalSettings {
|
impl Settings 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 Setting for LanguageSettings {
|
impl Settings 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)
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
|
@ -8,7 +8,7 @@ use schemars::{
|
||||||
};
|
};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use settings2::{Settings, SettingsJsonSchemaParams};
|
use settings2::SettingsJsonSchemaParams;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use util::ResultExt as _;
|
use util::ResultExt as _;
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ 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) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue