From 1c567baa8e9ee74ced21b200c9f05af42e615994 Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 21 Oct 2025 02:58:56 -0400 Subject: [PATCH] More proof of concept --- crates/settings_ui/src/settings_ui.rs | 43 +++++++++++++++------------ 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/crates/settings_ui/src/settings_ui.rs b/crates/settings_ui/src/settings_ui.rs index b1491c6765b9d24b27ac331d6fd9f7df849da9df..402650a61dc1e1f528d4299c28797bc3c5a69864 100644 --- a/crates/settings_ui/src/settings_ui.rs +++ b/crates/settings_ui/src/settings_ui.rs @@ -224,18 +224,22 @@ impl Global for SettingFieldRenderer {} #[derive(Default, Clone)] struct SettingsJsonKeyFinder { - key_finders: Rc Option>>>>, + key_finders: Rc String>>>>, } impl Global for SettingsJsonKeyFinder {} impl SettingsJsonKeyFinder { - fn add_basic_json_key_finder( - &mut self, - field: SettingField, - ) -> &mut Self { + fn add_basic_json_key_finder(&mut self) -> &mut Self { let key = TypeId::of::(); - let key_finder = Box::new(move |mut content: SettingsContent| { + let key_finder = Box::new(move |any_field: &dyn AnySettingField| { + let field = *any_field + .as_any() + .downcast_ref::>() + .unwrap(); + + let mut content = SettingsContent::default(); + // Write the field with a default value (field.write)(&mut content, Some(T::default())); @@ -244,18 +248,18 @@ impl SettingsJsonKeyFinder { .expect("Failed to serialize SettingsContent"); // Extract the JSON path from the string (should only have one entry) - extract_json_path_from_string(&json_string) + extract_json_path_from_string(&json_string).unwrap() }); self.key_finders.borrow_mut().insert(key, key_finder); self } - fn find_json_path(&self) -> Option { - let key = TypeId::of::(); + #[allow(dead_code)] + fn find_json_path(&self, field: &dyn AnySettingField) -> String { + let key = field.type_id(); let key_finders = self.key_finders.borrow(); - let key_finder = key_finders.get(&key)?; - let content = SettingsContent::default(); - key_finder(content) + let key_finder = key_finders.get(&key).unwrap(); + key_finder(field) } } @@ -434,10 +438,7 @@ pub fn init(cx: &mut App) { fn init_json_key_finders(cx: &mut App) { cx.default_global::() - .add_basic_json_key_finder(SettingField:: { - pick: |content| content.vim_mode.as_ref(), - write: |content, value| content.vim_mode = value, - }); + .add_basic_json_key_finder::(); } fn init_renderers(cx: &mut App) { @@ -3209,11 +3210,15 @@ mod test { register_settings(cx); init_json_key_finders(cx); + let bool_field = SettingField:: { + pick: |content| content.vim_mode.as_ref(), + write: |content, value| content.vim_mode = value, + }; + let json_key_finder = cx.global::(); - let path = json_key_finder.find_json_path::(); - dbg!(&path); + let path = json_key_finder.find_json_path(&bool_field); - assert_eq!(path, Some("vim_mode".to_string())); + assert_eq!(path, "vim_mode".to_string()); }); }