1use anyhow::Result;
2use serde_json::Value;
3
4pub fn remove_formatters_on_save(value: &mut Value) -> Result<()> {
5 remove_formatters_on_save_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_formatters_on_save_inner(language, &path)?;
14 }
15 }
16 Ok(())
17}
18
19fn remove_formatters_on_save_inner(value: &mut Value, path: &[&str]) -> Result<()> {
20 let Some(obj) = value.as_object_mut() else {
21 return Ok(());
22 };
23 let Some(format_on_save) = obj.get("format_on_save").cloned() else {
24 return Ok(());
25 };
26 let is_format_on_save_set_to_formatter = format_on_save
27 .as_str()
28 .map_or(true, |s| s != "on" && s != "off");
29 if !is_format_on_save_set_to_formatter {
30 return Ok(());
31 }
32
33 fn fmt_path(path: &[&str], key: &str) -> String {
34 let mut path = path.to_vec();
35 path.push(key);
36 path.join(".")
37 }
38
39 anyhow::ensure!(
40 obj.get("formatter").is_none(),
41 r#"Setting formatters in both "format_on_save" and "formatter" is deprecated. Please migrate the formatters from {} into {}"#,
42 fmt_path(path, "format_on_save"),
43 fmt_path(path, "formatter")
44 );
45
46 obj.insert("format_on_save".to_string(), serde_json::json!("on"));
47 obj.insert("formatter".to_string(), format_on_save);
48
49 Ok(())
50}