automapper_validation/generated/fv2610/utilmd_strom_conditions_fv2610.rs
1// <auto-generated>
2// Generated by automapper-generator generate-conditions
3// AHB: xml-migs-and-ahbs/FV2610/UTILMD_AHB_Strom_2_2_20260401.xml
4// Generated: 2026-04-22T18:25:39Z
5// Delegates unchanged conditions to UtilmdStromConditionEvaluatorFV2510 (FV2510).
6// </auto-generated>
7
8#![allow(clippy::style, clippy::complexity)]
9
10#[allow(unused_imports)]
11use crate::eval::format_validators::*;
12use crate::eval::{ConditionEvaluator, ConditionResult, EvaluationContext};
13use crate::generated::fv2510::UtilmdStromConditionEvaluatorFV2510;
14
15/// Condition evaluator for UTILMD_Strom FV2610.
16///
17/// Delegates to [`UtilmdStromConditionEvaluatorFV2510`] for conditions whose AHB description is
18/// unchanged from that version. Local overrides: [23, 24, 41, 63, 67, 79, 80, 81, 82, 158, 159, 181, 203, 263, 353, 354, 381, 382, 383, 422, 423, 424, 531, 555, 571, 701, 2002].
19pub struct UtilmdStromConditionEvaluatorFV2610 {
20 fallback: UtilmdStromConditionEvaluatorFV2510,
21}
22
23impl Default for UtilmdStromConditionEvaluatorFV2610 {
24 fn default() -> Self {
25 Self {
26 fallback: UtilmdStromConditionEvaluatorFV2510::default(),
27 }
28 }
29}
30
31/// Condition IDs whose implementation differs from the fallback.
32const FV2610_OVERRIDES: &[u32] = &[
33 23, 24, 41, 63, 67, 79, 80, 81, 82, 158, 159, 181, 203, 263, 353, 354, 381, 382, 383, 422, 423,
34 424, 531, 555, 571, 701, 2002,
35];
36
37impl ConditionEvaluator for UtilmdStromConditionEvaluatorFV2610 {
38 fn message_type(&self) -> &str {
39 "UTILMD_Strom"
40 }
41
42 fn format_version(&self) -> &str {
43 "FV2610"
44 }
45
46 fn evaluate(&self, condition: u32, ctx: &EvaluationContext) -> ConditionResult {
47 match condition {
48 23 => self.evaluate_23(ctx),
49 24 => self.evaluate_24(ctx),
50 41 => self.evaluate_41(ctx),
51 63 => self.evaluate_63(ctx),
52 67 => self.evaluate_67(ctx),
53 79 => self.evaluate_79(ctx),
54 80 => self.evaluate_80(ctx),
55 81 => self.evaluate_81(ctx),
56 82 => self.evaluate_82(ctx),
57 158 => self.evaluate_158(ctx),
58 159 => self.evaluate_159(ctx),
59 181 => self.evaluate_181(ctx),
60 203 => self.evaluate_203(ctx),
61 263 => self.evaluate_263(ctx),
62 353 => self.evaluate_353(ctx),
63 354 => self.evaluate_354(ctx),
64 381 => self.evaluate_381(ctx),
65 382 => self.evaluate_382(ctx),
66 383 => self.evaluate_383(ctx),
67 422 => self.evaluate_422(ctx),
68 423 => self.evaluate_423(ctx),
69 424 => self.evaluate_424(ctx),
70 531 => self.evaluate_531(ctx),
71 555 => self.evaluate_555(ctx),
72 571 => self.evaluate_571(ctx),
73 701 => self.evaluate_701(ctx),
74 2002 => self.evaluate_2002(ctx),
75 other => self.fallback.evaluate(other, ctx),
76 }
77 }
78
79 fn is_external(&self, condition: u32) -> bool {
80 matches!(
81 condition,
82 181 | 353 | 354 | 381 | 382 | 383 | 422 | 423 | 424
83 ) || self.fallback.is_external(condition)
84 }
85
86 fn is_known(&self, condition: u32) -> bool {
87 FV2610_OVERRIDES.contains(&condition) || self.fallback.is_known(condition)
88 }
89}
90
91impl UtilmdStromConditionEvaluatorFV2610 {
92 /// [23] Wenn in dieser SG4 das STS+E01++A05 (Status der Antwort) vorhanden
93 fn evaluate_23(&self, ctx: &EvaluationContext) -> ConditionResult {
94 ctx.has_segment_matching_in_group("STS", &[(0, 0, "E01"), (2, 0, "A05")], &["SG4"])
95 }
96
97 /// [24] Wenn in dieser SG4 das STS+E01++A25 (Status der Antwort) vorhanden
98 fn evaluate_24(&self, ctx: &EvaluationContext) -> ConditionResult {
99 ctx.has_segment_matching_in_group("STS", &[(0, 0, "E01"), (2, 0, "A25")], &["SG4"])
100 }
101
102 /// [41] Es ist eine Produktpaket-ID aus dem DE1050 von einem SG8 SEQ+Z79 (Bestandteil eines Produktpakets) zu nennen
103 // REVIEW: Cross-reference validation: the current field must contain a Produktpaket-ID from DE1050 (elements[1][0]) of some SG8 SEQ+Z79. Collects all valid Produktpaket-IDs across SG8 instances and checks the resolved field value is among them. Medium confidence: 'zu nennen' interpreted as a cross-reference constraint; if it is purely informational the body should return True unconditionally. (medium confidence)
104 fn evaluate_41(&self, ctx: &EvaluationContext) -> ConditionResult {
105 let nav = match ctx.navigator() {
106 Some(n) => n,
107 None => return ConditionResult::Unknown,
108 };
109 let sg8_count = nav.group_instance_count(&["SG4", "SG8"]);
110 let mut valid_ids: std::collections::HashSet<String> = std::collections::HashSet::new();
111 for i in 0..sg8_count {
112 let seq_segs = nav.find_segments_in_group("SEQ", &["SG4", "SG8"], i);
113 for seq in &seq_segs {
114 if seq
115 .elements
116 .first()
117 .and_then(|e| e.first())
118 .is_some_and(|v| v == "Z79")
119 {
120 if let Some(val) = seq.elements.get(1).and_then(|e| e.first()) {
121 if !val.is_empty() {
122 valid_ids.insert(val.clone());
123 }
124 }
125 }
126 }
127 }
128 if valid_ids.is_empty() {
129 return ConditionResult::Unknown;
130 }
131 if let Some(current_val) = ctx.resolved_value {
132 return ConditionResult::from(valid_ids.contains(current_val));
133 }
134 ConditionResult::Unknown
135 }
136
137 /// [63] Wenn in dieser SG4 das STS+E01++A15 (Status der Antwort) vorhanden
138 fn evaluate_63(&self, ctx: &EvaluationContext) -> ConditionResult {
139 ctx.has_segment_matching_in_group("STS", &[(0, 0, "E01"), (2, 0, "A15")], &["SG4"])
140 }
141
142 /// [67] Wenn in keinem SG8 SEQ+Z79 (Bestandteil eine Produktpakets) CCI+Z66/CAV+ZH9 (Produkteigenschaft/ Code der Produkteigenschaft) der Code 9991000002933 (Ruhende Marktlokation ausprägen) vorhanden ist.
143 // REVIEW: Absence check: returns True when NO SG8 with SEQ+Z79 has an SG10 child containing CCI+Z66 (Produkteigenschaft) co-occurring with CAV bearing value 9991000002933 (Ruhende Marktlokation ausprägen). Returns False as soon as the disqualifying combination is found. Medium confidence: CAV element layout for ZH9/9991000002933 is ambiguous without the MIG XML — implementation checks both ZH9+9991000002933 as a composite and 9991000002933 as a bare first component. (medium confidence)
144 fn evaluate_67(&self, ctx: &EvaluationContext) -> ConditionResult {
145 let nav = match ctx.navigator() {
146 Some(n) => n,
147 None => return ConditionResult::Unknown,
148 };
149 let sg8_count = nav.group_instance_count(&["SG4", "SG8"]);
150 for i in 0..sg8_count {
151 let seq_segs = nav.find_segments_in_group("SEQ", &["SG4", "SG8"], i);
152 let has_z79 = seq_segs.iter().any(|s| {
153 s.elements
154 .first()
155 .and_then(|e| e.first())
156 .is_some_and(|v| v == "Z79")
157 });
158 if !has_z79 {
159 continue;
160 }
161 let sg10_count = nav.child_group_instance_count(&["SG4", "SG8"], i, "SG10");
162 for j in 0..sg10_count {
163 let ccis = nav.find_segments_in_child_group("CCI", &["SG4", "SG8"], i, "SG10", j);
164 let has_cci_z66 = ccis.iter().any(|s| {
165 s.elements
166 .first()
167 .and_then(|e| e.first())
168 .is_some_and(|v| v == "Z66")
169 });
170 if has_cci_z66 {
171 let cavs =
172 nav.find_segments_in_child_group("CAV", &["SG4", "SG8"], i, "SG10", j);
173 let has_target = cavs.iter().any(|s| {
174 let first_elem = s.elements.first();
175 let qualifier = first_elem.and_then(|e| e.first()).map(|v| v.as_str());
176 let value = first_elem.and_then(|e| e.get(1)).map(|v| v.as_str());
177 (qualifier == Some("ZH9") && value == Some("9991000002933"))
178 || qualifier == Some("9991000002933")
179 });
180 if has_target {
181 return ConditionResult::False;
182 }
183 }
184 }
185 }
186 ConditionResult::True
187 }
188
189 /// [79] Wenn SG4 STS+7++Z33 (Auszug wegen Stilllegung) vorhanden
190 fn evaluate_79(&self, ctx: &EvaluationContext) -> ConditionResult {
191 ctx.has_segment_matching_in_group("STS", &[(0, 0, "7"), (2, 0, "Z33")], &["SG4"])
192 }
193
194 /// [80] Wenn in derselben SG8 SEQ+Z61 (Produkt-Daten der Steuerbaren Ressource) das PIA+5 (Produkt-Daten der Steuerbaren Ressource) nicht vorhanden
195 fn evaluate_80(&self, ctx: &EvaluationContext) -> ConditionResult {
196 ctx.any_group_has_qualifier_without("SEQ", 0, "Z61", "PIA", 0, "5", &["SG4", "SG8"])
197 }
198
199 /// [81] Wenn in derselben SG8 SEQ+Z61/ ZB3/ ZB4 (Produkt-Daten der Steuerbaren Ressource) das SG10 CCI+11 (Details zum Produkt der Steuerbaren Ressource) nicht vorhanden
200 // REVIEW: Multi-qualifier SEQ check (Z61/ZB3/ZB4) combined with SG10 child absence requires the navigator. Returns True when any SG8 with a qualifying SEQ has no SG10 child with CCI+11. Medium confidence: three-way qualifier match and SG10 absence via child group iteration. (medium confidence)
201 fn evaluate_81(&self, ctx: &EvaluationContext) -> ConditionResult {
202 let nav = match ctx.navigator() {
203 Some(n) => n,
204 None => return ConditionResult::Unknown,
205 };
206 let sg8_count = nav.group_instance_count(&["SG4", "SG8"]);
207 for i in 0..sg8_count {
208 let seq_segs = nav.find_segments_in_group("SEQ", &["SG4", "SG8"], i);
209 let has_qualifying_seq = seq_segs.iter().any(|s| {
210 s.elements
211 .first()
212 .and_then(|e| e.first())
213 .is_some_and(|v| matches!(v.as_str(), "Z61" | "ZB3" | "ZB4"))
214 });
215 if !has_qualifying_seq {
216 continue;
217 }
218 let sg10_count = nav.child_group_instance_count(&["SG4", "SG8"], i, "SG10");
219 let has_cci_11 = (0..sg10_count).any(|j| {
220 let ccis = nav.find_segments_in_child_group("CCI", &["SG4", "SG8"], i, "SG10", j);
221 ccis.iter().any(|s| {
222 s.elements
223 .first()
224 .and_then(|e| e.first())
225 .is_some_and(|v| v == "11")
226 })
227 });
228 if !has_cci_11 {
229 return ConditionResult::True;
230 }
231 }
232 ConditionResult::False
233 }
234
235 /// [82] Wenn in der selben SG8 (Daten der technischen Einrichtungen) das SG10 CCI+Z63 (Information zu technischen Einrichtungen) CAV+ZH7 (Technische Einrichtungen vorhanden) vorhanden
236 // REVIEW: Checks if any SG10 child of any SG8 contains both CCI+Z63 (Information zu technischen Einrichtungen) and CAV+ZH7 (Technische Einrichtungen vorhanden) in the same SG10 instance. Both qualifiers checked at elements[0][0] following the CAV+qualifier pattern from Example 10. Medium confidence: no parent SG8 qualifier filter specified; CCI element position assumed from established pattern. (medium confidence)
237 fn evaluate_82(&self, ctx: &EvaluationContext) -> ConditionResult {
238 let nav = match ctx.navigator() {
239 Some(n) => n,
240 None => return ctx.has_qualifier("CAV", 0, "ZH7"),
241 };
242 let sg8_count = nav.group_instance_count(&["SG4", "SG8"]);
243 for i in 0..sg8_count {
244 let sg10_count = nav.child_group_instance_count(&["SG4", "SG8"], i, "SG10");
245 for j in 0..sg10_count {
246 let ccis = nav.find_segments_in_child_group("CCI", &["SG4", "SG8"], i, "SG10", j);
247 let has_cci_z63 = ccis.iter().any(|s| {
248 s.elements
249 .first()
250 .and_then(|e| e.first())
251 .is_some_and(|v| v == "Z63")
252 });
253 if has_cci_z63 {
254 let cavs =
255 nav.find_segments_in_child_group("CAV", &["SG4", "SG8"], i, "SG10", j);
256 if cavs.iter().any(|s| {
257 s.elements
258 .first()
259 .and_then(|e| e.first())
260 .is_some_and(|v| v == "ZH7")
261 }) {
262 return ConditionResult::True;
263 }
264 }
265 }
266 }
267 ConditionResult::False
268 }
269
270 /// [158] Wenn in derselben SG8 SEQ+Z57 (OBIS-Daten der Netzlokation) das PIA+5 (OBIS-Daten der Netzlokation) nicht vorhanden
271 fn evaluate_158(&self, ctx: &EvaluationContext) -> ConditionResult {
272 ctx.any_group_has_qualifier_without("SEQ", 0, "Z57", "PIA", 0, "5", &["SG4", "SG8"])
273 }
274
275 /// [159] Wenn in derselben SG8 SEQ+Z57 (OBIS-Daten der Netzlokation) das SG10 CCI+11 (OBIS-Daten der Netzlokation) nicht vorhanden
276 fn evaluate_159(&self, ctx: &EvaluationContext) -> ConditionResult {
277 let result = ctx.filtered_parent_child_has_qualifier(
278 &["SG4", "SG8"],
279 "SEQ",
280 0,
281 "Z57",
282 "SG10",
283 "CCI",
284 0,
285 "11",
286 );
287 match result {
288 ConditionResult::True => ConditionResult::False,
289 ConditionResult::False => ConditionResult::True,
290 ConditionResult::Unknown => ConditionResult::Unknown,
291 }
292 }
293
294 /// [181] Wenn der Versender datenschutzrechtliche Voraussetzungen geschaffen hat, um die Daten bereitstellen zu dürfen
295 /// EXTERNAL: Requires context from outside the message.
296 fn evaluate_181(&self, ctx: &EvaluationContext) -> ConditionResult {
297 ctx.external
298 .evaluate("sender_has_data_protection_prerequisites")
299 }
300
301 /// [203] Wenn STS+7++E06 / Z39 / ZC6 / ZC7/ ZT6/ ZT7 / Z02 / ZZD vorhanden
302 fn evaluate_203(&self, ctx: &EvaluationContext) -> ConditionResult {
303 ctx.has_qualified_value(
304 "STS",
305 0,
306 "7",
307 2,
308 0,
309 &["E06", "Z39", "ZC6", "ZC7", "ZT6", "ZT7", "Z02", "ZZD"],
310 )
311 }
312
313 /// [263] Wenn SG8 SEQ+Z01 (Daten der Marktlokation) SG10 CCI+Z30++Z07 (Verbrauch) vorhanden
314 fn evaluate_263(&self, ctx: &EvaluationContext) -> ConditionResult {
315 let nav = match ctx.navigator() {
316 Some(n) => n,
317 None => return ctx.has_qualified_value("CCI", 0, "Z30", 2, 0, &["Z07"]),
318 };
319 let sg8_count = nav.group_instance_count(&["SG4", "SG8"]);
320 for i in 0..sg8_count {
321 let seq_segs = nav.find_segments_in_group("SEQ", &["SG4", "SG8"], i);
322 let has_z01 = seq_segs.iter().any(|s| {
323 s.elements
324 .first()
325 .and_then(|e| e.first())
326 .is_some_and(|v| v == "Z01")
327 });
328 if !has_z01 {
329 continue;
330 }
331 let sg10_count = nav.child_group_instance_count(&["SG4", "SG8"], i, "SG10");
332 for j in 0..sg10_count {
333 let ccis = nav.find_segments_in_child_group("CCI", &["SG4", "SG8"], i, "SG10", j);
334 for cci in &ccis {
335 let elem0 = cci
336 .elements
337 .first()
338 .and_then(|e| e.first())
339 .map(|s| s.as_str());
340 let elem2 = cci
341 .elements
342 .get(2)
343 .and_then(|e| e.first())
344 .map(|s| s.as_str());
345 if elem0 == Some("Z30") && elem2 == Some("Z07") {
346 return ConditionResult::True;
347 }
348 }
349 }
350 }
351 ConditionResult::False
352 }
353
354 /// [353] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/NeLo“ als auch in der ...
355 /// EXTERNAL: Requires context from outside the message.
356 fn evaluate_353(&self, ctx: &EvaluationContext) -> ConditionResult {
357 ctx.external
358 .evaluate("verwendungszweck_code_valid_nelocation_nb")
359 }
360
361 /// [354] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/NeLo“ als auch in der ...
362 /// EXTERNAL: Requires context from outside the message.
363 fn evaluate_354(&self, ctx: &EvaluationContext) -> ConditionResult {
364 ctx.external
365 .evaluate("verwendungszweck_code_valid_nelocation_lf")
366 }
367
368 /// [381] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/MaLo“ als auch in der ...
369 /// EXTERNAL: Requires context from outside the message.
370 fn evaluate_381(&self, ctx: &EvaluationContext) -> ConditionResult {
371 ctx.external
372 .evaluate("verwendungszweck_code_valid_malocation_nb")
373 }
374
375 /// [382] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/MaLo“ als auch in der ...
376 /// EXTERNAL: Requires context from outside the message.
377 fn evaluate_382(&self, ctx: &EvaluationContext) -> ConditionResult {
378 ctx.external
379 .evaluate("verwendungszweck_code_valid_malocation_lf")
380 }
381
382 /// [383] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/MaLo“ als auch in der ...
383 /// EXTERNAL: Requires context from outside the message.
384 fn evaluate_383(&self, ctx: &EvaluationContext) -> ConditionResult {
385 ctx.external
386 .evaluate("verwendungszweck_code_valid_malocation_uenb")
387 }
388
389 /// [422] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/Tranche“ als auch in d...
390 /// EXTERNAL: Requires context from outside the message.
391 fn evaluate_422(&self, ctx: &EvaluationContext) -> ConditionResult {
392 ctx.external
393 .evaluate("verwendungszweck_code_valid_tranche_nb")
394 }
395
396 /// [423] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/Tranche“ als auch in d...
397 /// EXTERNAL: Requires context from outside the message.
398 // REVIEW: References external code list from Kapitel 2 (Codeliste der Verwendungszwecke) filtered by 'Lokation/Tranche' and 'Verwendbar für Marktrolle/LF' columns, plus OBIS-Kennzahl matching — all three criteria require external business context unavailable in the EDIFACT message alone (medium confidence)
399 fn evaluate_423(&self, ctx: &EvaluationContext) -> ConditionResult {
400 ctx.external.evaluate("verwendungszweck_valid_for_lf")
401 }
402
403 /// [424] Zulässig sind ausschließlich Codes aus der Spalte „Code“ der Codeliste der Verwendungszwecke (Kapitel 2), sofern in derselben Zeile sowohl in der Spalte „Lokation/Tranche“ als auch in d...
404 /// EXTERNAL: Requires context from outside the message.
405 // REVIEW: References external code list from Kapitel 2 (Codeliste der Verwendungszwecke) filtered by 'Lokation/Tranche' and 'Verwendbar für Marktrolle/ÜNB' columns, plus OBIS-Kennzahl matching — all three criteria require external business context unavailable in the EDIFACT message alone (medium confidence)
406 fn evaluate_424(&self, ctx: &EvaluationContext) -> ConditionResult {
407 ctx.external.evaluate("verwendungszweck_valid_for_uenb")
408 }
409
410 /// [531] Hinweis: Es ist das Jahr anzugeben in dem die nächste Netznutzungsabrechnung erfolgt. Diese Information ist zu der Zeitraum-ID anzugeben, welche SG6 RFF+Z49 (Verwendungszeitraum der Daten: Gültig...
411 fn evaluate_531(&self, _ctx: &EvaluationContext) -> ConditionResult {
412 // Hinweis: year of next Netznutzungsabrechnung to be stated for the Zeitraum-ID in SG6 RFF+Z49 — informational note, always applies
413 ConditionResult::True
414 }
415
416 /// [555] Hinweis: Es sind die Produktpaket-ID aus der Anmeldung zu nennen, welche nicht umgesetzt werden konnten
417 fn evaluate_555(&self, _ctx: &EvaluationContext) -> ConditionResult {
418 // Hinweis: Produktpaket-IDs from the Anmeldung that could not be implemented — informational note, always applies
419 ConditionResult::True
420 }
421
422 /// [571] Hinweis: Es sind alle erforderlichen Produkte aus der Anmeldung des LF des im selben SG8 genannten Produktpaket-ID zu nennen welche nicht umgesetzt werden konnten
423 fn evaluate_571(&self, _ctx: &EvaluationContext) -> ConditionResult {
424 // Hinweis: all required products from LF Anmeldung for the Produktpaket-ID in the same SG8 that could not be implemented — informational note, always applies
425 ConditionResult::True
426 }
427
428 /// [701] Hinweis: Es ist die Malo-ID der Tranche zu nennen, der die Technische Ressource zugeordnet ist
429 fn evaluate_701(&self, _ctx: &EvaluationContext) -> ConditionResult {
430 // Hinweis: MaLo-ID of the Tranche to which the Technische Ressource is assigned — informational note, always applies
431 ConditionResult::True
432 }
433
434 /// [2002] Für jede Produktpaket-ID im SG8 SEQ+Z79 (Bestandteil eines Produktpakets) DE1050 genau einmal anzugeben
435 fn evaluate_2002(&self, ctx: &EvaluationContext) -> ConditionResult {
436 let nav = match ctx.navigator() {
437 Some(n) => n,
438 None => return ConditionResult::Unknown,
439 };
440 let sg8_count = nav.group_instance_count(&["SG4", "SG8"]);
441 let mut seen = std::collections::HashSet::new();
442 for i in 0..sg8_count {
443 let seq_segs = nav.find_segments_in_group("SEQ", &["SG4", "SG8"], i);
444 for seq in &seq_segs {
445 if seq
446 .elements
447 .first()
448 .and_then(|e| e.first())
449 .is_some_and(|v| v == "Z79")
450 {
451 if let Some(val) = seq.elements.get(1).and_then(|e| e.first()) {
452 if !val.is_empty() && !seen.insert(val.clone()) {
453 return ConditionResult::False;
454 }
455 }
456 }
457 }
458 }
459 if seen.is_empty() {
460 ConditionResult::Unknown
461 } else {
462 ConditionResult::True
463 }
464 }
465}