-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathnode_match.dart
41 lines (33 loc) · 983 Bytes
/
node_match.dart
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import 'package:json_path/json_path.dart';
import 'package:json_path/src/node.dart';
import 'package:json_path/src/normalized/index_selector.dart';
import 'package:json_path/src/normalized/name_selector.dart';
import 'package:rfc_6901/rfc_6901.dart';
class NodeMatch implements JsonPathMatch {
NodeMatch(Node node)
: value = node.value,
path = node.path(),
pointer = node.pointer();
@override
final String path;
@override
final JsonPointer pointer;
@override
final Object? value;
}
extension<T> on Node<T> {
Iterable<Object> trace() sync* {
if (key != null) {
yield* parent!.trace();
yield key!;
}
if (index != null) {
yield* parent!.trace();
yield index!;
}
}
JsonPointer pointer() => JsonPointer.build(trace().map((e) => e.toString()));
String path() => r'$' + trace().map(_segment).join();
Object _segment(Object? v) =>
v is int ? IndexSelector(v) : NameSelector(v.toString());
}