dcbor_pattern/pattern/structure/
mod.rs

1mod 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}