1use std::ops::Range;
2use tree_sitter::{Query, QueryMatch};
3
4use crate::MigrationPatterns;
5use crate::patterns::SETTINGS_ROOT_KEY_VALUE_PATTERN;
6
7pub const SETTINGS_PATTERNS: MigrationPatterns = &[
8 (SETTINGS_ROOT_KEY_VALUE_PATTERN, replace_setting_name),
9 (SETTINGS_ROOT_KEY_VALUE_PATTERN, replace_setting_value),
10];
11
12fn replace_setting_value(
13 contents: &str,
14 mat: &QueryMatch,
15 query: &Query,
16) -> Option<(Range<usize>, String)> {
17 let setting_capture_ix = query.capture_index_for_name("name")?;
18 let setting_name_range = mat
19 .nodes_for_capture_index(setting_capture_ix)
20 .next()?
21 .byte_range();
22 let setting_name = contents.get(setting_name_range)?;
23
24 if setting_name != "hide_mouse_while_typing" {
25 return None;
26 }
27
28 let value_capture_ix = query.capture_index_for_name("value")?;
29 let value_range = mat
30 .nodes_for_capture_index(value_capture_ix)
31 .next()?
32 .byte_range();
33 let value = contents.get(value_range.clone())?;
34
35 let new_value = if value.trim() == "true" {
36 "\"on_typing_and_movement\""
37 } else if value.trim() == "false" {
38 "\"never\""
39 } else {
40 return None;
41 };
42
43 Some((value_range, new_value.to_string()))
44}
45
46fn replace_setting_name(
47 contents: &str,
48 mat: &QueryMatch,
49 query: &Query,
50) -> Option<(Range<usize>, String)> {
51 let setting_capture_ix = query.capture_index_for_name("name")?;
52 let setting_name_range = mat
53 .nodes_for_capture_index(setting_capture_ix)
54 .next()?
55 .byte_range();
56 let setting_name = contents.get(setting_name_range.clone())?;
57
58 let new_setting_name = if setting_name == "hide_mouse_while_typing" {
59 "hide_mouse"
60 } else {
61 return None;
62 };
63
64 Some((setting_name_range, new_setting_name.to_string()))
65}