dcbor_pattern/pattern/structure/
mod.rs1mod array_pattern;
2mod map_pattern;
3mod tagged_pattern;
4
5pub use array_pattern::ArrayPattern;
6use dcbor::prelude::*;
7pub use map_pattern::*;
8pub use tagged_pattern::*;
9
10use crate::pattern::{Matcher, Path, Pattern, vm::Instr};
11
12#[derive(Debug, Clone, PartialEq, Eq)]
13pub enum StructurePattern {
14 Array(ArrayPattern),
15 Map(MapPattern),
16 Tagged(TaggedPattern),
17}
18
19impl Matcher for StructurePattern {
20 fn paths(&self, haystack: &CBOR) -> Vec<Path> {
21 match self {
22 StructurePattern::Array(pattern) => pattern.paths(haystack),
23 StructurePattern::Map(pattern) => pattern.paths(haystack),
24 StructurePattern::Tagged(pattern) => pattern.paths(haystack),
25 }
26 }
27
28 fn compile(
29 &self,
30 code: &mut Vec<Instr>,
31 literals: &mut Vec<Pattern>,
32 captures: &mut Vec<String>,
33 ) {
34 match self {
35 StructurePattern::Array(pattern) => {
36 pattern.compile(code, literals, captures)
37 }
38 StructurePattern::Map(pattern) => {
39 pattern.compile(code, literals, captures)
40 }
41 StructurePattern::Tagged(pattern) => {
42 pattern.compile(code, literals, captures)
43 }
44 }
45 }
46
47 fn collect_capture_names(&self, names: &mut Vec<String>) {
48 match self {
49 StructurePattern::Array(pattern) => {
50 pattern.collect_capture_names(names)
51 }
52 StructurePattern::Map(pattern) => {
53 pattern.collect_capture_names(names)
54 }
55 StructurePattern::Tagged(pattern) => {
56 pattern.collect_capture_names(names)
57 }
58 }
59 }
60
61 fn paths_with_captures(
62 &self,
63 haystack: &CBOR,
64 ) -> (Vec<Path>, std::collections::HashMap<String, Vec<Path>>) {
65 match self {
66 StructurePattern::Array(pattern) => {
67 pattern.paths_with_captures(haystack)
68 }
69 StructurePattern::Map(pattern) => {
70 pattern.paths_with_captures(haystack)
71 }
72 StructurePattern::Tagged(pattern) => {
73 pattern.paths_with_captures(haystack)
74 }
75 }
76 }
77}
78
79impl std::fmt::Display for StructurePattern {
80 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81 match self {
82 StructurePattern::Array(pattern) => write!(f, "{}", pattern),
83 StructurePattern::Map(pattern) => write!(f, "{}", pattern),
84 StructurePattern::Tagged(pattern) => write!(f, "{}", pattern),
85 }
86 }
87}