1use anyhow::Result;
2use serde_json::Value;
3
4pub fn remove_code_actions_on_format(value: &mut Value) -> Result<()> {
5 remove_code_actions_on_format_inner(value, &[])?;
6 let languages = value
7 .as_object_mut()
8 .and_then(|obj| obj.get_mut("languages"))
9 .and_then(|languages| languages.as_object_mut());
10 if let Some(languages) = languages {
11 for (language_name, language) in languages.iter_mut() {
12 let path = vec!["languages", language_name];
13 remove_code_actions_on_format_inner(language, &path)?;
14 }
15 }
16 Ok(())
17}
18
19fn remove_code_actions_on_format_inner(value: &mut Value, path: &[&str]) -> Result<()> {
20 let Some(obj) = value.as_object_mut() else {
21 return Ok(());
22 };
23 let Some(code_actions_on_format) = obj.get("code_actions_on_format").cloned() else {
24 return Ok(());
25 };
26
27 fn fmt_path(path: &[&str], key: &str) -> String {
28 let mut path = path.to_vec();
29 path.push(key);
30 path.join(".")
31 }
32
33 anyhow::ensure!(
34 code_actions_on_format.is_object(),
35 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>"#,
36 fmt_path(path, "code_actions_on_format"),
37 );
38
39 let code_actions_map = code_actions_on_format.as_object().unwrap();
40 let mut code_actions = vec![];
41 for (code_action, code_action_enabled) in code_actions_map {
42 if code_action_enabled.as_bool().map_or(false, |b| !b) {
43 continue;
44 }
45 code_actions.push(code_action.clone());
46 }
47
48 let mut formatter_array = vec![];
49 if let Some(formatter) = obj.get("formatter") {
50 if let Some(array) = formatter.as_array() {
51 formatter_array = array.clone();
52 } else {
53 formatter_array.insert(0, formatter.clone());
54 }
55 };
56 let found_code_actions = !code_actions.is_empty();
57 formatter_array.splice(
58 0..0,
59 code_actions
60 .into_iter()
61 .map(|code_action| serde_json::json!({"code_action": code_action})),
62 );
63
64 obj.remove("code_actions_on_format");
65 if found_code_actions {
66 obj.insert("formatter".to_string(), Value::Array(formatter_array));
67 }
68
69 Ok(())
70}