diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index cfaff7fa40..060e7c0415 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -2975,6 +2975,20 @@ impl Project { }), Err(_) => {} }, + SettingsObserverEvent::LocalDebugScenariosUpdated(result) => match result { + Err(InvalidSettingsError::Debug { message, path }) => { + let message = + format!("Failed to set local debug scenarios in {path:?}:\n{message}"); + cx.emit(Event::Toast { + notification_id: format!("local-debug-scenarios-{path:?}").into(), + message, + }); + } + Ok(path) => cx.emit(Event::HideToast { + notification_id: format!("local-debug-scenarios-{path:?}").into(), + }), + Err(_) => {} + }, } } diff --git a/crates/project/src/project_settings.rs b/crates/project/src/project_settings.rs index f45393fd5c..38f9166bcd 100644 --- a/crates/project/src/project_settings.rs +++ b/crates/project/src/project_settings.rs @@ -554,6 +554,7 @@ pub enum SettingsObserverMode { pub enum SettingsObserverEvent { LocalSettingsUpdated(Result), LocalTasksUpdated(Result), + LocalDebugScenariosUpdated(Result), } impl EventEmitter for SettingsObserver {} @@ -565,6 +566,7 @@ pub struct SettingsObserver { project_id: u64, task_store: Entity, _global_task_config_watcher: Task<()>, + _global_debug_config_watcher: Task<()>, } /// SettingsObserver observers changes to .zed/{settings, task}.json files in local worktrees @@ -597,6 +599,11 @@ impl SettingsObserver { paths::tasks_file().clone(), cx, ), + _global_debug_config_watcher: Self::subscribe_to_global_debug_scenarios_changes( + fs.clone(), + paths::debug_scenarios_file().clone(), + cx, + ), } } @@ -617,6 +624,11 @@ impl SettingsObserver { paths::tasks_file().clone(), cx, ), + _global_debug_config_watcher: Self::subscribe_to_global_debug_scenarios_changes( + fs.clone(), + paths::debug_scenarios_file().clone(), + cx, + ), } } @@ -1047,6 +1059,61 @@ impl SettingsObserver { } }) } + fn subscribe_to_global_debug_scenarios_changes( + fs: Arc, + file_path: PathBuf, + cx: &mut Context, + ) -> Task<()> { + let mut user_tasks_file_rx = + watch_config_file(&cx.background_executor(), fs, file_path.clone()); + let user_tasks_content = cx.background_executor().block(user_tasks_file_rx.next()); + let weak_entry = cx.weak_entity(); + cx.spawn(async move |settings_observer, cx| { + let Ok(task_store) = settings_observer.read_with(cx, |settings_observer, _| { + settings_observer.task_store.clone() + }) else { + return; + }; + if let Some(user_tasks_content) = user_tasks_content { + let Ok(()) = task_store.update(cx, |task_store, cx| { + task_store + .update_user_debug_scenarios( + TaskSettingsLocation::Global(&file_path), + Some(&user_tasks_content), + cx, + ) + .log_err(); + }) else { + return; + }; + } + while let Some(user_tasks_content) = user_tasks_file_rx.next().await { + let Ok(result) = task_store.update(cx, |task_store, cx| { + task_store.update_user_debug_scenarios( + TaskSettingsLocation::Global(&file_path), + Some(&user_tasks_content), + cx, + ) + }) else { + break; + }; + + weak_entry + .update(cx, |_, cx| match result { + Ok(()) => cx.emit(SettingsObserverEvent::LocalDebugScenariosUpdated(Ok( + file_path.clone(), + ))), + Err(err) => cx.emit(SettingsObserverEvent::LocalDebugScenariosUpdated( + Err(InvalidSettingsError::Tasks { + path: file_path.clone(), + message: err.to_string(), + }), + )), + }) + .ok(); + } + }) + } } pub fn local_settings_kind_from_proto(kind: proto::LocalSettingsKind) -> LocalSettingsKind {