Skip to main content

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}