xsd_parser/pipeline/optimizer/
merge_choice_cardinality.rs1use crate::models::{meta::MetaTypeVariant, schema::MaxOccurs, Ident};
2
3use super::{Error, Optimizer};
4
5impl Optimizer {
6 #[doc = include_str!("../../../tests/optimizer/complex_choice.xsd")]
19 #[doc = include_str!("../../../tests/optimizer/expected0/merge_choice_cardinalities.rs")]
24 #[doc = include_str!("../../../tests/optimizer/expected1/merge_choice_cardinalities.rs")]
29 pub fn merge_choice_cardinality(mut self, ident: Ident) -> Result<Self, Error> {
31 tracing::debug!("merge_choice_cardinality(ident={ident:?})");
32
33 let Some(ty) = self.types.get_variant(&ident) else {
34 return Err(Error::UnknownType(ident));
35 };
36
37 let MetaTypeVariant::ComplexType(ci) = ty else {
38 return Err(Error::ExpectedComplexType(ident));
39 };
40
41 let Some(content_ident) = ci.content.clone() else {
42 return Err(Error::MissingContentType(ident));
43 };
44
45 let Some(MetaTypeVariant::Choice(ci)) = self.types.get_variant_mut(&content_ident) else {
46 return Err(Error::ExpectedComplexChoice(ident));
47 };
48
49 let mut min = 1;
50 let mut max = MaxOccurs::Bounded(1);
51
52 for element in &mut *ci.elements {
53 min = min.min(element.min_occurs);
54 max = max.max(element.max_occurs);
55
56 element.min_occurs = 1;
57 element.max_occurs = MaxOccurs::Bounded(1);
58 }
59
60 let Some(MetaTypeVariant::ComplexType(ci)) = self.types.get_variant_mut(&ident) else {
61 unreachable!();
62 };
63
64 ci.min_occurs = min.min(ci.min_occurs);
65 ci.max_occurs = max.max(ci.max_occurs);
66
67 Ok(self)
68 }
69
70 pub fn merge_choice_cardinalities(mut self) -> Self {
75 tracing::debug!("merge_choice_cardinalities");
76
77 let idents = self
78 .types
79 .items
80 .iter()
81 .filter_map(|(ident, type_)| {
82 if matches!(&type_.variant, MetaTypeVariant::ComplexType(ci) if ci.has_complex_choice_content(&self.types)) {
83 Some(ident)
84 } else {
85 None
86 }
87 })
88 .cloned()
89 .collect::<Vec<_>>();
90
91 for ident in idents {
92 self = self.merge_choice_cardinality(ident).unwrap();
93 }
94
95 self
96 }
97}