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});