1use std::ops::Range;
2
3use tree_sitter::{Query, QueryMatch};
4
5use crate::MigrationPatterns;
6
7pub const SETTINGS_PATTERNS: MigrationPatterns = &[
8 (
9 SETTINGS_CUSTOM_CONTEXT_SERVER_PATTERN,
10 migrate_custom_context_server_settings,
11 ),
12 (
13 SETTINGS_EXTENSION_CONTEXT_SERVER_PATTERN,
14 migrate_extension_context_server_settings,
15 ),
16 (
17 SETTINGS_EMPTY_CONTEXT_SERVER_PATTERN,
18 migrate_empty_context_server_settings,
19 ),
20];
21
22const SETTINGS_CUSTOM_CONTEXT_SERVER_PATTERN: &str = r#"(document
23 (object
24 (pair
25 key: (string (string_content) @context-servers)
26 value: (object
27 (pair
28 key: (string)
29 value: (object
30 (pair
31 key: (string (string_content) @previous-key)
32 value: (object)
33 )*
34 (pair
35 key: (string (string_content) @key)
36 value: (object)
37 )
38 (pair
39 key: (string (string_content) @next-key)
40 value: (object)
41 )*
42 ) @server-settings
43 )
44 )
45 )
46 )
47 (#eq? @context-servers "context_servers")
48 (#eq? @key "command")
49 (#not-eq? @previous-key "source")
50 (#not-eq? @next-key "source")
51)"#;
52
53fn migrate_custom_context_server_settings(
54 _contents: &str,
55 mat: &QueryMatch,
56 query: &Query,
57) -> Option<(Range<usize>, String)> {
58 let server_settings_index = query.capture_index_for_name("server-settings")?;
59 let server_settings = mat.nodes_for_capture_index(server_settings_index).next()?;
60 // Move forward 1 to get inside the object
61 let start = server_settings.start_byte() + 1;
62
63 Some((
64 start..start,
65 r#"
66 "source": "custom","#
67 .to_string(),
68 ))
69}
70
71const SETTINGS_EXTENSION_CONTEXT_SERVER_PATTERN: &str = r#"(document
72 (object
73 (pair
74 key: (string (string_content) @context-servers)
75 value: (object
76 (pair
77 key: (string)
78 value: (object
79 (pair
80 key: (string (string_content) @previous-key)
81 value: (object)
82 )*
83 (pair
84 key: (string (string_content) @key)
85 value: (object)
86 )
87 (pair
88 key: (string (string_content) @next-key)
89 value: (object)
90 )*
91 ) @server-settings
92 )
93 )
94 )
95 )
96 (#eq? @context-servers "context_servers")
97 (#eq? @key "settings")
98 (#not-match? @previous-key "^command|source$")
99 (#not-match? @next-key "^command|source$")
100)"#;
101
102fn migrate_extension_context_server_settings(
103 _contents: &str,
104 mat: &QueryMatch,
105 query: &Query,
106) -> Option<(Range<usize>, String)> {
107 let server_settings_index = query.capture_index_for_name("server-settings")?;
108 let server_settings = mat.nodes_for_capture_index(server_settings_index).next()?;
109 // Move forward 1 to get inside the object
110 let start = server_settings.start_byte() + 1;
111
112 Some((
113 start..start,
114 r#"
115 "source": "extension","#
116 .to_string(),
117 ))
118}
119
120const SETTINGS_EMPTY_CONTEXT_SERVER_PATTERN: &str = r#"(document
121 (object
122 (pair
123 key: (string (string_content) @context-servers)
124 value: (object
125 (pair
126 key: (string)
127 value: (object) @server-settings
128 )
129 )
130 )
131 )
132 (#eq? @context-servers "context_servers")
133 (#eq? @server-settings "{}")
134)"#;
135
136fn migrate_empty_context_server_settings(
137 _contents: &str,
138 mat: &QueryMatch,
139 query: &Query,
140) -> Option<(Range<usize>, String)> {
141 let server_settings_index = query.capture_index_for_name("server-settings")?;
142 let server_settings = mat.nodes_for_capture_index(server_settings_index).next()?;
143
144 Some((
145 server_settings.byte_range(),
146 r#"{
147 "source": "extension",
148 "settings": {}
149 }"#
150 .to_string(),
151 ))
152}