settings.rs

 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}