settings.rs

 1use collections::HashMap;
 2use std::{ops::Range, sync::LazyLock};
 3use tree_sitter::{Query, QueryMatch};
 4
 5use crate::MigrationPatterns;
 6use crate::patterns::SETTINGS_NESTED_KEY_VALUE_PATTERN;
 7
 8pub const SETTINGS_PATTERNS: MigrationPatterns = &[(
 9    SETTINGS_NESTED_KEY_VALUE_PATTERN,
10    replace_deprecated_settings_values,
11)];
12
13fn replace_deprecated_settings_values(
14    contents: &str,
15    mat: &QueryMatch,
16    query: &Query,
17) -> Option<(Range<usize>, String)> {
18    let parent_object_capture_ix = query.capture_index_for_name("parent_key")?;
19    let parent_object_range = mat
20        .nodes_for_capture_index(parent_object_capture_ix)
21        .next()?
22        .byte_range();
23    let parent_object_name = contents.get(parent_object_range)?;
24
25    let setting_name_ix = query.capture_index_for_name("setting_name")?;
26    let setting_name_range = mat
27        .nodes_for_capture_index(setting_name_ix)
28        .next()?
29        .byte_range();
30    let setting_name = contents.get(setting_name_range)?;
31
32    let setting_value_ix = query.capture_index_for_name("setting_value")?;
33    let setting_value_range = mat
34        .nodes_for_capture_index(setting_value_ix)
35        .next()?
36        .byte_range();
37    let setting_value = contents.get(setting_value_range.clone())?;
38
39    UPDATED_SETTINGS
40        .get(&(parent_object_name, setting_name))
41        .and_then(|new_values| {
42            new_values
43                .iter()
44                .find_map(|(old_value, new_value)| {
45                    (*old_value == setting_value).then(|| new_value.to_string())
46                })
47                .map(|new_value| (setting_value_range, new_value))
48        })
49}
50
51static UPDATED_SETTINGS: LazyLock<HashMap<(&str, &str), Vec<(&str, &str)>>> = LazyLock::new(|| {
52    HashMap::from_iter([
53        (
54            ("chat_panel", "button"),
55            vec![("true", "\"always\""), ("false", "\"never\"")],
56        ),
57        (
58            ("scrollbar", "diagnostics"),
59            vec![("true", "\"all\""), ("false", "\"none\"")],
60        ),
61    ])
62});