1use anyhow::Result;
2use serde_json::Value;
3
4use crate::patterns::migrate_language_setting;
5
6pub fn remove_code_actions_on_format(value: &mut Value) -> Result<()> {
7 migrate_language_setting(value, remove_code_actions_on_format_inner)
8}
9
10fn remove_code_actions_on_format_inner(value: &mut Value, path: &[&str]) -> Result<()> {
11 let Some(obj) = value.as_object_mut() else {
12 return Ok(());
13 };
14 let Some(code_actions_on_format) = obj.get("code_actions_on_format").cloned() else {
15 return Ok(());
16 };
17
18 fn fmt_path(path: &[&str], key: &str) -> String {
19 let mut path = path.to_vec();
20 path.push(key);
21 path.join(".")
22 }
23
24 anyhow::ensure!(
25 code_actions_on_format.is_object(),
26 r#"The `code_actions_on_format` setting is deprecated, but it is in an invalid state and cannot be migrated at {}. Please ensure the code_actions_on_format setting is a Map<String, bool>"#,
27 fmt_path(path, "code_actions_on_format"),
28 );
29
30 let code_actions_map = code_actions_on_format.as_object().unwrap();
31 let mut code_actions = vec![];
32 for (code_action, code_action_enabled) in code_actions_map {
33 if code_action_enabled.as_bool().map_or(false, |b| !b) {
34 continue;
35 }
36 code_actions.push(code_action.clone());
37 }
38
39 let mut formatter_array = vec![];
40 if let Some(formatter) = obj.get("formatter") {
41 if let Some(array) = formatter.as_array() {
42 formatter_array = array.clone();
43 } else {
44 formatter_array.insert(0, formatter.clone());
45 }
46 };
47 let found_code_actions = !code_actions.is_empty();
48 formatter_array.splice(
49 0..0,
50 code_actions
51 .into_iter()
52 .map(|code_action| serde_json::json!({"code_action": code_action})),
53 );
54
55 obj.remove("code_actions_on_format");
56 if found_code_actions {
57 obj.insert("formatter".to_string(), Value::Array(formatter_array));
58 }
59
60 Ok(())
61}