dcbor_pattern/pattern/value/
value_pattern.rs

1use super::{
2    BoolPattern, ByteStringPattern, DatePattern, DigestPattern,
3    KnownValuePattern, NullPattern, NumberPattern, TextPattern,
4};
5use crate::pattern::{Matcher, Path, Pattern, vm::Instr};
6use dcbor::prelude::*;
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9pub enum ValuePattern {
10    Bool(BoolPattern),
11    ByteString(ByteStringPattern),
12    Date(DatePattern),
13    Digest(DigestPattern),
14    KnownValue(KnownValuePattern),
15    Null(NullPattern),
16    Number(NumberPattern),
17    Text(TextPattern),
18}
19
20impl Matcher for ValuePattern {
21    fn paths(&self, haystack: &CBOR) -> Vec<Path> {
22        match self {
23            ValuePattern::Bool(pattern) => pattern.paths(haystack),
24            ValuePattern::ByteString(pattern) => pattern.paths(haystack),
25            ValuePattern::Date(pattern) => pattern.paths(haystack),
26            ValuePattern::Digest(pattern) => pattern.paths(haystack),
27            ValuePattern::KnownValue(pattern) => pattern.paths(haystack),
28            ValuePattern::Null(pattern) => pattern.paths(haystack),
29            ValuePattern::Number(pattern) => pattern.paths(haystack),
30            ValuePattern::Text(pattern) => pattern.paths(haystack),
31        }
32    }
33
34    fn compile(
35        &self,
36        code: &mut Vec<Instr>,
37        literals: &mut Vec<Pattern>,
38        captures: &mut Vec<String>,
39    ) {
40        match self {
41            ValuePattern::Bool(pattern) => {
42                pattern.compile(code, literals, captures)
43            }
44            ValuePattern::ByteString(pattern) => {
45                pattern.compile(code, literals, captures)
46            }
47            ValuePattern::Date(pattern) => {
48                pattern.compile(code, literals, captures)
49            }
50            ValuePattern::Digest(pattern) => {
51                pattern.compile(code, literals, captures)
52            }
53            ValuePattern::KnownValue(pattern) => {
54                pattern.compile(code, literals, captures)
55            }
56            ValuePattern::Null(pattern) => {
57                pattern.compile(code, literals, captures)
58            }
59            ValuePattern::Number(pattern) => {
60                pattern.compile(code, literals, captures)
61            }
62            ValuePattern::Text(pattern) => {
63                pattern.compile(code, literals, captures)
64            }
65        }
66    }
67}
68
69impl std::fmt::Display for ValuePattern {
70    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
71        match self {
72            ValuePattern::Bool(pattern) => write!(f, "{}", pattern),
73            ValuePattern::ByteString(pattern) => write!(f, "{}", pattern),
74            ValuePattern::Date(pattern) => write!(f, "{}", pattern),
75            ValuePattern::Digest(pattern) => write!(f, "{}", pattern),
76            ValuePattern::KnownValue(pattern) => write!(f, "{}", pattern),
77            ValuePattern::Null(pattern) => write!(f, "{}", pattern),
78            ValuePattern::Number(pattern) => write!(f, "{}", pattern),
79            ValuePattern::Text(pattern) => write!(f, "{}", pattern),
80        }
81    }
82}