settings.rs

 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}