settings.rs

  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}