qubit_metadata/filter/
metadata_filter.rs1use serde::{Deserialize, Deserializer, Serialize, Serializer, de};
11
12use super::filter_expr::FilterExpr;
13use super::metadata_filter_builder::MetadataFilterBuilder;
14use super::wire::MetadataFilterWire;
15use crate::metadata::Metadata;
16use crate::{
17 Condition, FilterMatchOptions, MetadataResult, MissingKeyPolicy, NumberComparisonPolicy,
18};
19
20#[derive(Debug, Clone, PartialEq, Default)]
26pub struct MetadataFilter {
27 pub(crate) expr: Option<FilterExpr>,
29 pub(crate) options: FilterMatchOptions,
31}
32
33impl MetadataFilter {
34 #[inline]
36 pub(crate) fn new(expr: Option<FilterExpr>, options: FilterMatchOptions) -> Self {
37 Self { expr, options }
38 }
39
40 #[inline]
42 #[must_use]
43 pub fn builder() -> MetadataFilterBuilder {
44 MetadataFilterBuilder::default()
45 }
46
47 #[inline]
49 #[must_use]
50 pub fn all() -> Self {
51 Self::default()
52 }
53
54 #[inline]
56 #[must_use]
57 pub fn none() -> Self {
58 Self {
59 expr: Some(FilterExpr::False),
60 options: FilterMatchOptions::default(),
61 }
62 }
63
64 #[inline]
66 #[must_use]
67 pub fn options(&self) -> FilterMatchOptions {
68 self.options
69 }
70
71 #[inline]
73 #[must_use]
74 pub fn with_options(mut self, options: FilterMatchOptions) -> Self {
75 self.options = options;
76 self
77 }
78
79 #[inline]
81 #[must_use]
82 pub fn with_missing_key_policy(mut self, missing_key_policy: MissingKeyPolicy) -> Self {
83 self.options.missing_key_policy = missing_key_policy;
84 self
85 }
86
87 #[inline]
89 #[must_use]
90 pub fn with_number_comparison_policy(
91 mut self,
92 number_comparison_policy: NumberComparisonPolicy,
93 ) -> Self {
94 self.options.number_comparison_policy = number_comparison_policy;
95 self
96 }
97
98 #[allow(clippy::should_implement_trait)]
100 #[inline]
101 #[must_use]
102 pub fn not(mut self) -> Self {
103 self.expr = MetadataFilterBuilder::negate_expr(self.expr);
104 self
105 }
106
107 #[inline]
109 #[must_use]
110 pub fn matches(&self, meta: &Metadata) -> bool {
111 self.matches_with_options(meta, self.options)
112 }
113
114 #[inline]
116 #[must_use]
117 pub fn matches_with_options(&self, meta: &Metadata, options: FilterMatchOptions) -> bool {
118 self.expr
119 .as_ref()
120 .is_none_or(|expr| expr.matches(meta, options))
121 }
122
123 pub(crate) fn visit_conditions<F>(&self, mut visitor: F) -> MetadataResult<()>
125 where
126 F: FnMut(&Condition) -> MetadataResult<()>,
127 {
128 if let Some(expr) = &self.expr {
129 expr.visit_conditions(&mut visitor)?;
130 }
131 Ok(())
132 }
133}
134
135impl Serialize for MetadataFilter {
136 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
137 where
138 S: Serializer,
139 {
140 MetadataFilterWire::from(self).serialize(serializer)
141 }
142}
143
144impl<'de> Deserialize<'de> for MetadataFilter {
145 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
146 where
147 D: Deserializer<'de>,
148 {
149 MetadataFilterWire::deserialize(deserializer)?
150 .into_filter()
151 .map_err(de::Error::custom)
152 }
153}
154
155impl std::ops::Not for MetadataFilter {
156 type Output = MetadataFilter;
157
158 #[inline]
159 fn not(self) -> Self::Output {
160 MetadataFilter::not(self)
161 }
162}