yerba 0.9.1-aarch64-linux-gnu → 0.10.0-aarch64-linux-gnu
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +60 -16
- data/exe/aarch64-linux-gnu/yerba +0 -0
- data/ext/yerba/include/yerba.h +67 -32
- data/ext/yerba/yerba.c +296 -186
- data/lib/yerba/3.2/yerba.so +0 -0
- data/lib/yerba/3.3/yerba.so +0 -0
- data/lib/yerba/3.4/yerba.so +0 -0
- data/lib/yerba/4.0/yerba.so +0 -0
- data/lib/yerba/collection.rb +4 -4
- data/lib/yerba/document.rb +134 -0
- data/lib/yerba/formatting.rb +1 -0
- data/lib/yerba/location.rb +8 -1
- data/lib/yerba/map.rb +16 -6
- data/lib/yerba/node.rb +41 -0
- data/lib/yerba/query_result.rb +33 -10
- data/lib/yerba/scalar.rb +29 -0
- data/lib/yerba/selector.rb +142 -0
- data/lib/yerba/sequence.rb +38 -33
- data/lib/yerba/version.rb +1 -1
- data/lib/yerba.rb +1 -0
- data/rust/Cargo.lock +1 -1
- data/rust/Cargo.toml +1 -1
- data/rust/src/commands/get.rs +12 -12
- data/rust/src/commands/init.rs +8 -8
- data/rust/src/commands/insert.rs +4 -18
- data/rust/src/commands/location.rs +2 -0
- data/rust/src/commands/mod.rs +34 -6
- data/rust/src/commands/move_item.rs +1 -1
- data/rust/src/commands/move_key.rs +8 -8
- data/rust/src/commands/rename.rs +1 -1
- data/rust/src/commands/selectors.rs +1 -1
- data/rust/src/commands/set.rs +14 -6
- data/rust/src/document/condition.rs +25 -25
- data/rust/src/document/delete.rs +57 -43
- data/rust/src/document/get.rs +91 -82
- data/rust/src/document/insert.rs +77 -77
- data/rust/src/document/mod.rs +138 -64
- data/rust/src/document/nodes.rs +162 -0
- data/rust/src/document/schema.rs +8 -8
- data/rust/src/document/set.rs +49 -26
- data/rust/src/document/sort.rs +54 -54
- data/rust/src/document/style.rs +50 -49
- data/rust/src/document/unique.rs +5 -5
- data/rust/src/error.rs +8 -4
- data/rust/src/ffi.rs +272 -102
- data/rust/src/json.rs +62 -2
- data/rust/src/lib.rs +2 -1
- data/rust/src/main.rs +2 -1
- data/rust/src/selector.rs +48 -7
- data/rust/src/syntax.rs +449 -56
- data/rust/src/validation.rs +5 -3
- data/rust/src/yerbafile.rs +124 -76
- metadata +4 -2
data/rust/src/document/insert.rs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
use super::*;
|
|
2
2
|
|
|
3
3
|
impl Document {
|
|
4
|
-
pub fn append(&mut self,
|
|
5
|
-
self.insert_into(
|
|
4
|
+
pub fn append(&mut self, selector: &str, value: &str) -> Result<(), YerbaError> {
|
|
5
|
+
self.insert_into(selector, value, InsertPosition::Last)
|
|
6
6
|
}
|
|
7
7
|
|
|
8
|
-
pub fn detect_sequence_quote_style(&self,
|
|
9
|
-
let try_paths = if
|
|
8
|
+
pub fn detect_sequence_quote_style(&self, selector: &str) -> QuoteStyle {
|
|
9
|
+
let try_paths = if selector.is_empty() {
|
|
10
10
|
vec!["[]".to_string(), "[0]".to_string()]
|
|
11
11
|
} else {
|
|
12
|
-
vec![format!("{}[]",
|
|
12
|
+
vec![format!("{}[]", selector), format!("{}[0]", selector)]
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
for try_path in &try_paths {
|
|
@@ -22,16 +22,16 @@ impl Document {
|
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
if let Some(yaml_serde::Value::Sequence(sequence)) = self.get_value(
|
|
25
|
+
if let Some(yaml_serde::Value::Sequence(sequence)) = self.get_value(selector).as_ref() {
|
|
26
26
|
if let Some(yaml_serde::Value::Mapping(map)) = sequence.first() {
|
|
27
27
|
if let Some((yaml_serde::Value::String(key_name), _)) = map.iter().next() {
|
|
28
|
-
let
|
|
28
|
+
let deep_selector = if selector.is_empty() {
|
|
29
29
|
format!("[].{}", key_name)
|
|
30
30
|
} else {
|
|
31
|
-
format!("{}[].{}",
|
|
31
|
+
format!("{}[].{}", selector, key_name)
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
for scalar in self.get_all_typed(&
|
|
34
|
+
for scalar in self.get_all_typed(&deep_selector) {
|
|
35
35
|
if scalar.kind == SyntaxKind::DOUBLE_QUOTED_SCALAR {
|
|
36
36
|
return QuoteStyle::Double;
|
|
37
37
|
} else if scalar.kind == SyntaxKind::SINGLE_QUOTED_SCALAR {
|
|
@@ -45,27 +45,27 @@ impl Document {
|
|
|
45
45
|
QuoteStyle::Plain
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
pub fn insert_object(&mut self,
|
|
49
|
-
let quote_style = self.detect_sequence_quote_style(
|
|
48
|
+
pub fn insert_object(&mut self, selector: &str, json_value: &serde_json::Value, position: InsertPosition) -> Result<(), YerbaError> {
|
|
49
|
+
let quote_style = self.detect_sequence_quote_style(selector);
|
|
50
50
|
let yaml_text = crate::yaml_writer::json_to_yaml_text(json_value, "e_style, 0);
|
|
51
51
|
|
|
52
|
-
self.insert_into(
|
|
52
|
+
self.insert_into(selector, &yaml_text, position)
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
pub fn insert_objects(&mut self,
|
|
55
|
+
pub fn insert_objects(&mut self, selector: &str, json_values: &[serde_json::Value]) -> Result<(), YerbaError> {
|
|
56
56
|
if json_values.is_empty() {
|
|
57
57
|
return Ok(());
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
-
let quote_style = self.detect_sequence_quote_style(
|
|
61
|
-
let current_node = self.navigate(
|
|
60
|
+
let quote_style = self.detect_sequence_quote_style(selector);
|
|
61
|
+
let current_node = self.navigate(selector)?;
|
|
62
62
|
|
|
63
|
-
let sequence = find_block_sequence(¤t_node).ok_or_else(|| YerbaError::NotASequence(
|
|
63
|
+
let sequence = find_block_sequence(¤t_node).ok_or_else(|| YerbaError::NotASequence(selector.to_string()))?;
|
|
64
64
|
|
|
65
65
|
let entries: Vec<_> = sequence.entries().collect();
|
|
66
66
|
|
|
67
67
|
if entries.is_empty() {
|
|
68
|
-
return Err(YerbaError::SelectorNotFound(
|
|
68
|
+
return Err(YerbaError::SelectorNotFound(selector.to_string()));
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
let indent = entries
|
|
@@ -88,60 +88,60 @@ impl Document {
|
|
|
88
88
|
self.insert_after_node(last_entry.syntax(), &new_text)
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
pub fn insert_into(&mut self,
|
|
92
|
-
self.insert_with(
|
|
91
|
+
pub fn insert_into(&mut self, selector: &str, value: &str, position: InsertPosition) -> Result<(), YerbaError> {
|
|
92
|
+
self.insert_with(selector, value, position, false)
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
-
pub fn insert_fragment_into(&mut self,
|
|
96
|
-
self.insert_with(
|
|
95
|
+
pub fn insert_fragment_into(&mut self, selector: &str, value: &str, position: InsertPosition) -> Result<(), YerbaError> {
|
|
96
|
+
self.insert_with(selector, value, position, true)
|
|
97
97
|
}
|
|
98
98
|
|
|
99
|
-
fn insert_with(&mut self,
|
|
100
|
-
Self::
|
|
101
|
-
self.refuse_flow_target(
|
|
99
|
+
fn insert_with(&mut self, selector: &str, value: &str, position: InsertPosition, fragment: bool) -> Result<(), YerbaError> {
|
|
100
|
+
Self::validate_selector(selector)?;
|
|
101
|
+
self.refuse_flow_target(selector)?;
|
|
102
102
|
|
|
103
|
-
if let Some((
|
|
104
|
-
if let Ok(parent) = self.navigate(
|
|
103
|
+
if let Some((parent_selector, _)) = selector.rsplit_once('.') {
|
|
104
|
+
if let Ok(parent) = self.navigate(parent_selector) {
|
|
105
105
|
let occupied_flow = find_flow_map(&parent).map(|map| !flow_map_entries(&map).is_empty()).unwrap_or(false)
|
|
106
106
|
|| find_flow_sequence(&parent)
|
|
107
107
|
.map(|sequence| !flow_sequence_entries(&sequence).is_empty())
|
|
108
108
|
.unwrap_or(false);
|
|
109
109
|
|
|
110
110
|
if occupied_flow {
|
|
111
|
-
return Err(YerbaError::FlowCollectionNotWritable(
|
|
111
|
+
return Err(YerbaError::FlowCollectionNotWritable(selector.to_string()));
|
|
112
112
|
}
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
|
|
116
|
-
if crate::selector::Selector::parse(
|
|
116
|
+
if crate::selector::Selector::parse(selector)
|
|
117
117
|
.segments()
|
|
118
118
|
.iter()
|
|
119
119
|
.any(|segment| matches!(segment, crate::selector::SelectorSegment::AllKeys))
|
|
120
120
|
{
|
|
121
|
-
return Err(YerbaError::SelectorNotFound(
|
|
121
|
+
return Err(YerbaError::SelectorNotFound(selector.to_string()));
|
|
122
122
|
}
|
|
123
123
|
|
|
124
|
-
if let Ok(current_node) = self.navigate(
|
|
124
|
+
if let Ok(current_node) = self.navigate(selector) {
|
|
125
125
|
if find_block_sequence(¤t_node).is_some()
|
|
126
|
-
|| matches!(self.get_value(
|
|
126
|
+
|| matches!(self.get_value(selector).as_ref(), Some(yaml_serde::Value::Sequence(sequence)) if sequence.is_empty())
|
|
127
127
|
{
|
|
128
|
-
return self.insert_sequence_item(
|
|
128
|
+
return self.insert_sequence_item(selector, value, position);
|
|
129
129
|
}
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
let
|
|
133
|
-
let has_wildcard =
|
|
134
|
-
let (
|
|
132
|
+
let parsed = crate::selector::Selector::parse(selector);
|
|
133
|
+
let has_wildcard = parsed.has_wildcard() || parsed.has_brackets();
|
|
134
|
+
let (parent_selector, key) = selector.rsplit_once('.').unwrap_or(("", selector));
|
|
135
135
|
|
|
136
136
|
if has_wildcard {
|
|
137
|
-
let count = self.navigate_all_compact(
|
|
137
|
+
let count = self.navigate_all_compact(parent_selector).len();
|
|
138
138
|
|
|
139
139
|
if count == 0 {
|
|
140
140
|
return Ok(());
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
for i in (0..count).rev() {
|
|
144
|
-
let nodes = self.navigate_all_compact(
|
|
144
|
+
let nodes = self.navigate_all_compact(parent_selector);
|
|
145
145
|
|
|
146
146
|
let node = match nodes.get(i) {
|
|
147
147
|
Some(node) => node.clone(),
|
|
@@ -156,10 +156,10 @@ impl Document {
|
|
|
156
156
|
.any(|descendant| descendant.kind() == SyntaxKind::FLOW_MAP && !descendant.descendants().any(|child| child.kind() == SyntaxKind::FLOW_MAP_ENTRY));
|
|
157
157
|
|
|
158
158
|
if has_empty_flow_map {
|
|
159
|
-
let selectors = self.resolve_selectors(
|
|
159
|
+
let selectors = self.resolve_selectors(parent_selector);
|
|
160
160
|
|
|
161
|
-
if let Some(
|
|
162
|
-
self.replace_empty_inline_map(
|
|
161
|
+
if let Some(item_selector) = selectors.get(i) {
|
|
162
|
+
self.replace_empty_inline_map(item_selector, key, value)?;
|
|
163
163
|
continue;
|
|
164
164
|
}
|
|
165
165
|
}
|
|
@@ -226,24 +226,24 @@ impl Document {
|
|
|
226
226
|
return Ok(());
|
|
227
227
|
}
|
|
228
228
|
|
|
229
|
-
self.insert_map_key(
|
|
229
|
+
self.insert_map_key(parent_selector, key, value, position, fragment)
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
fn insert_sequence_item(&mut self,
|
|
233
|
-
let current_node = self.navigate(
|
|
232
|
+
fn insert_sequence_item(&mut self, selector: &str, value: &str, position: InsertPosition) -> Result<(), YerbaError> {
|
|
233
|
+
let current_node = self.navigate(selector)?;
|
|
234
234
|
|
|
235
235
|
let Some(sequence) = find_block_sequence(¤t_node) else {
|
|
236
|
-
if matches!(self.get_value(
|
|
237
|
-
return self.replace_empty_inline_sequence(
|
|
236
|
+
if matches!(self.get_value(selector).as_ref(), Some(yaml_serde::Value::Sequence(sequence)) if sequence.is_empty()) {
|
|
237
|
+
return self.replace_empty_inline_sequence(selector, value);
|
|
238
238
|
}
|
|
239
239
|
|
|
240
|
-
return Err(YerbaError::NotASequence(
|
|
240
|
+
return Err(YerbaError::NotASequence(selector.to_string()));
|
|
241
241
|
};
|
|
242
242
|
|
|
243
243
|
let entries: Vec<_> = sequence.entries().collect();
|
|
244
244
|
|
|
245
245
|
if entries.is_empty() {
|
|
246
|
-
return Err(YerbaError::SelectorNotFound(
|
|
246
|
+
return Err(YerbaError::SelectorNotFound(selector.to_string()));
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
let indent = entries
|
|
@@ -288,7 +288,7 @@ impl Document {
|
|
|
288
288
|
.map(|text| text == target_value)
|
|
289
289
|
.unwrap_or(false)
|
|
290
290
|
})
|
|
291
|
-
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} item '{}'",
|
|
291
|
+
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} item '{}'", selector, target_value)))?;
|
|
292
292
|
|
|
293
293
|
let target_range = target_entry.syntax().text_range();
|
|
294
294
|
let replacement = format!("{}\n{}", new_item, indent);
|
|
@@ -307,7 +307,7 @@ impl Document {
|
|
|
307
307
|
.map(|text| text == target_value)
|
|
308
308
|
.unwrap_or(false)
|
|
309
309
|
})
|
|
310
|
-
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} item '{}'",
|
|
310
|
+
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} item '{}'", selector, target_value)))?;
|
|
311
311
|
|
|
312
312
|
let new_text = format!("\n{}{}", indent, new_item);
|
|
313
313
|
|
|
@@ -318,7 +318,7 @@ impl Document {
|
|
|
318
318
|
let target_entry = entries
|
|
319
319
|
.iter()
|
|
320
320
|
.find(|entry| self.evaluate_condition_on_node(entry.syntax(), &condition))
|
|
321
|
-
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} condition '{}'",
|
|
321
|
+
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} condition '{}'", selector, condition)))?;
|
|
322
322
|
|
|
323
323
|
let target_range = target_entry.syntax().text_range();
|
|
324
324
|
let replacement = format!("{}\n{}", new_item, indent);
|
|
@@ -331,7 +331,7 @@ impl Document {
|
|
|
331
331
|
let target_entry = entries
|
|
332
332
|
.iter()
|
|
333
333
|
.find(|entry| self.evaluate_condition_on_node(entry.syntax(), &condition))
|
|
334
|
-
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} condition '{}'",
|
|
334
|
+
.ok_or_else(|| YerbaError::SelectorNotFound(format!("{} condition '{}'", selector, condition)))?;
|
|
335
335
|
|
|
336
336
|
let new_text = format!("\n{}{}", indent, new_item);
|
|
337
337
|
|
|
@@ -347,8 +347,8 @@ impl Document {
|
|
|
347
347
|
}
|
|
348
348
|
}
|
|
349
349
|
|
|
350
|
-
fn insert_map_key(&mut self,
|
|
351
|
-
let current_node = self.navigate(
|
|
350
|
+
fn insert_map_key(&mut self, selector: &str, key: &str, value: &str, position: InsertPosition, fragment: bool) -> Result<(), YerbaError> {
|
|
351
|
+
let current_node = self.navigate(selector)?;
|
|
352
352
|
|
|
353
353
|
let map = match find_block_map(¤t_node) {
|
|
354
354
|
Some(map) => map,
|
|
@@ -359,11 +359,11 @@ impl Document {
|
|
|
359
359
|
let is_empty = !flow_map_node.descendants().any(|descendant| descendant.kind() == SyntaxKind::FLOW_MAP_ENTRY);
|
|
360
360
|
|
|
361
361
|
if is_empty {
|
|
362
|
-
return self.replace_empty_inline_map(
|
|
362
|
+
return self.replace_empty_inline_map(selector, key, value);
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
|
|
366
|
-
return Err(YerbaError::SelectorNotFound(
|
|
366
|
+
return Err(YerbaError::SelectorNotFound(selector.to_string()));
|
|
367
367
|
}
|
|
368
368
|
};
|
|
369
369
|
|
|
@@ -377,7 +377,7 @@ impl Document {
|
|
|
377
377
|
}
|
|
378
378
|
|
|
379
379
|
if find_entry_by_key(&map, key).is_some() {
|
|
380
|
-
return Err(YerbaError::ParseError(format!("key '{}' already exists at '{}'", key,
|
|
380
|
+
return Err(YerbaError::ParseError(format!("key '{}' already exists at '{}'", key, selector)));
|
|
381
381
|
}
|
|
382
382
|
|
|
383
383
|
let indent = entries
|
|
@@ -413,7 +413,7 @@ impl Document {
|
|
|
413
413
|
}
|
|
414
414
|
|
|
415
415
|
InsertPosition::Before(target_key) => {
|
|
416
|
-
let target_entry = find_entry_by_key(&map, &target_key).ok_or_else(|| YerbaError::SelectorNotFound(format!("{}.{}",
|
|
416
|
+
let target_entry = find_entry_by_key(&map, &target_key).ok_or_else(|| YerbaError::SelectorNotFound(format!("{}.{}", selector, target_key)))?;
|
|
417
417
|
|
|
418
418
|
let target_range = target_entry.syntax().text_range();
|
|
419
419
|
let replacement = format!("{}\n{}", new_entry_text, indent);
|
|
@@ -423,14 +423,14 @@ impl Document {
|
|
|
423
423
|
}
|
|
424
424
|
|
|
425
425
|
InsertPosition::After(target_key) => {
|
|
426
|
-
let target_entry = find_entry_by_key(&map, &target_key).ok_or_else(|| YerbaError::SelectorNotFound(format!("{}.{}",
|
|
426
|
+
let target_entry = find_entry_by_key(&map, &target_key).ok_or_else(|| YerbaError::SelectorNotFound(format!("{}.{}", selector, target_key)))?;
|
|
427
427
|
|
|
428
428
|
let new_text = format!("\n{}{}", indent, new_entry_text);
|
|
429
429
|
|
|
430
430
|
self.insert_after_node(target_entry.syntax(), &new_text)
|
|
431
431
|
}
|
|
432
432
|
|
|
433
|
-
InsertPosition::BeforeCondition(_) | InsertPosition::AfterCondition(_) => self.insert_map_key(
|
|
433
|
+
InsertPosition::BeforeCondition(_) | InsertPosition::AfterCondition(_) => self.insert_map_key(selector, key, value, InsertPosition::Last, fragment),
|
|
434
434
|
|
|
435
435
|
InsertPosition::FromSortOrder(order) => {
|
|
436
436
|
let new_key_position = order.iter().position(|ordered_key| ordered_key == key);
|
|
@@ -455,19 +455,19 @@ impl Document {
|
|
|
455
455
|
None => InsertPosition::Last,
|
|
456
456
|
};
|
|
457
457
|
|
|
458
|
-
self.insert_map_key(
|
|
458
|
+
self.insert_map_key(selector, key, value, resolved, fragment)
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
|
|
463
|
-
fn replace_empty_inline_map(&mut self,
|
|
464
|
-
let current_node = self.navigate(
|
|
463
|
+
fn replace_empty_inline_map(&mut self, selector: &str, key: &str, value: &str) -> Result<(), YerbaError> {
|
|
464
|
+
let current_node = self.navigate(selector)?;
|
|
465
465
|
|
|
466
|
-
if
|
|
466
|
+
if selector.is_empty() {
|
|
467
467
|
let flow_map = current_node
|
|
468
468
|
.descendants()
|
|
469
469
|
.find(|descendant| descendant.kind() == SyntaxKind::FLOW_MAP)
|
|
470
|
-
.ok_or_else(|| YerbaError::SelectorNotFound(
|
|
470
|
+
.ok_or_else(|| YerbaError::SelectorNotFound(selector.to_string()))?;
|
|
471
471
|
|
|
472
472
|
let range = flow_map.text_range();
|
|
473
473
|
|
|
@@ -482,12 +482,12 @@ impl Document {
|
|
|
482
482
|
return self.apply_edit(adjusted_range, &replacement);
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
-
let (
|
|
486
|
-
let parent_node = self.navigate(
|
|
485
|
+
let (parent_selector, map_key) = selector.rsplit_once('.').unwrap_or(("", selector));
|
|
486
|
+
let parent_node = self.navigate(parent_selector)?;
|
|
487
487
|
|
|
488
|
-
let map = find_block_map(&parent_node).ok_or_else(|| YerbaError::SelectorNotFound(
|
|
488
|
+
let map = find_block_map(&parent_node).ok_or_else(|| YerbaError::SelectorNotFound(selector.to_string()))?;
|
|
489
489
|
|
|
490
|
-
let entry = find_entry_by_key(&map, map_key).ok_or_else(|| YerbaError::SelectorNotFound(
|
|
490
|
+
let entry = find_entry_by_key(&map, map_key).ok_or_else(|| YerbaError::SelectorNotFound(selector.to_string()))?;
|
|
491
491
|
let entry_indent = preceding_whitespace_indent(entry.syntax());
|
|
492
492
|
let child_indent = format!("{} ", entry_indent);
|
|
493
493
|
let new_entry_text = format!("{}{}: {}", child_indent, key, value);
|
|
@@ -505,13 +505,13 @@ impl Document {
|
|
|
505
505
|
self.apply_edit(range, &replacement)
|
|
506
506
|
}
|
|
507
507
|
|
|
508
|
-
fn replace_empty_inline_sequence(&mut self,
|
|
509
|
-
if
|
|
510
|
-
let current_node = self.navigate(
|
|
508
|
+
fn replace_empty_inline_sequence(&mut self, selector: &str, value: &str) -> Result<(), YerbaError> {
|
|
509
|
+
if selector.is_empty() {
|
|
510
|
+
let current_node = self.navigate(selector)?;
|
|
511
511
|
let flow_sequence = current_node
|
|
512
512
|
.descendants()
|
|
513
513
|
.find(|descendant| descendant.kind() == SyntaxKind::FLOW_SEQ)
|
|
514
|
-
.ok_or_else(|| YerbaError::NotASequence(
|
|
514
|
+
.ok_or_else(|| YerbaError::NotASequence(selector.to_string()))?;
|
|
515
515
|
|
|
516
516
|
let new_item = Self::format_sequence_item(value, "");
|
|
517
517
|
let range = flow_sequence.text_range();
|
|
@@ -528,15 +528,15 @@ impl Document {
|
|
|
528
528
|
return self.apply_edit(adjusted_range, &replacement);
|
|
529
529
|
}
|
|
530
530
|
|
|
531
|
-
let (
|
|
532
|
-
let parent_node = self.navigate(
|
|
531
|
+
let (parent_selector, key) = selector.rsplit_once('.').unwrap_or(("", selector));
|
|
532
|
+
let parent_node = self.navigate(parent_selector)?;
|
|
533
533
|
|
|
534
|
-
let map = find_block_map(&parent_node).ok_or_else(|| YerbaError::NotASequence(
|
|
534
|
+
let map = find_block_map(&parent_node).ok_or_else(|| YerbaError::NotASequence(selector.to_string()))?;
|
|
535
535
|
|
|
536
|
-
let entry = find_entry_by_key(&map, key).ok_or_else(|| YerbaError::SelectorNotFound(
|
|
536
|
+
let entry = find_entry_by_key(&map, key).ok_or_else(|| YerbaError::SelectorNotFound(selector.to_string()))?;
|
|
537
537
|
let item_indent = format!("{} ", preceding_whitespace_indent(entry.syntax()));
|
|
538
538
|
let new_item = Self::format_sequence_item(value, &item_indent);
|
|
539
|
-
let current_node = self.navigate(
|
|
539
|
+
let current_node = self.navigate(selector)?;
|
|
540
540
|
let inline_comment = self.trailing_inline_comment(¤t_node);
|
|
541
541
|
|
|
542
542
|
let mut range = current_node.text_range();
|