xsd_parser/pipeline/renderer/steps/quick_xml/
deserialize.rs

1#![allow(clippy::redundant_closure_for_method_calls)]
2
3use std::collections::HashSet;
4use std::ops::Not;
5
6use proc_macro2::{Ident as Ident2, TokenStream};
7use quote::{format_ident, quote};
8
9use crate::config::TypedefMode;
10use crate::models::{
11    data::{
12        ComplexBase, ComplexData, ComplexDataAttribute, ComplexDataContent, ComplexDataElement,
13        ComplexDataEnum, ComplexDataStruct, DataTypeVariant, DerivedType, DynamicData,
14        EnumerationData, EnumerationTypeVariant, Occurs, ReferenceData, StructMode, UnionData,
15        UnionTypeVariant,
16    },
17    meta::{ComplexMeta, ElementMeta, ElementMetaVariant, ElementMode, MetaTypeVariant, MetaTypes},
18    schema::{xs::Use, MaxOccurs},
19    Ident,
20};
21
22use super::super::super::{
23    context::{Context, ValueKey},
24    RenderStep,
25};
26
27/// Implements a [`RenderStep`] that renders the code for the `quick_xml` deserialization.
28#[derive(Debug)]
29pub struct QuickXmlDeserializeRenderStep {
30    /// Whether to box the deserializer or not.
31    ///
32    /// Boxing the deserializer will reduce the stack usage, but may decrease
33    /// the performance.
34    pub boxed_deserializer: bool,
35}
36
37struct BoxedDeserializer;
38
39impl ValueKey for BoxedDeserializer {
40    type Type = bool;
41}
42
43impl RenderStep for QuickXmlDeserializeRenderStep {
44    fn render_type(&mut self, ctx: &mut Context<'_, '_>) {
45        ctx.set::<BoxedDeserializer>(self.boxed_deserializer);
46
47        match &ctx.data.variant {
48            DataTypeVariant::BuildIn(_) | DataTypeVariant::Custom(_) => (),
49            DataTypeVariant::Union(x) => x.render_deserializer(ctx),
50            DataTypeVariant::Dynamic(x) => x.render_deserializer(ctx),
51            DataTypeVariant::Reference(x) => x.render_deserializer(ctx),
52            DataTypeVariant::Enumeration(x) => x.render_deserializer(ctx),
53            DataTypeVariant::Complex(x) => x.render_deserializer(ctx),
54        }
55
56        ctx.unset::<BoxedDeserializer>();
57    }
58}
59
60/* UnionType */
61
62impl UnionData<'_> {
63    pub(crate) fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
64        let Self {
65            type_ident,
66            variants,
67            ..
68        } = self;
69
70        let xsd_parser = &ctx.xsd_parser_crate;
71        let variants = variants
72            .iter()
73            .map(|var| var.render_deserializer_variant(ctx));
74
75        let usings = [
76            quote!(#xsd_parser::quick_xml::Error),
77            quote!(#xsd_parser::quick_xml::ErrorKind),
78            quote!(#xsd_parser::quick_xml::DeserializeBytes),
79            quote!(#xsd_parser::quick_xml::XmlReader),
80        ];
81        let code = quote! {
82            impl DeserializeBytes for #type_ident {
83                fn deserialize_bytes<R>(
84                    reader: &R,
85                    bytes: &[u8],
86                ) -> Result<Self, Error>
87                where
88                    R: XmlReader
89                {
90                    let mut errors = Vec::new();
91
92                    #( #variants )*
93
94                    Err(reader.map_error(ErrorKind::InvalidUnion(errors.into())))
95                }
96            }
97        };
98
99        ctx.module().usings(usings).append(code);
100    }
101}
102
103impl UnionTypeVariant<'_> {
104    fn render_deserializer_variant(&self, ctx: &Context<'_, '_>) -> TokenStream {
105        let Self {
106            variant_ident,
107            target_type,
108            ..
109        } = self;
110
111        let target_type = ctx.resolve_type_for_module(target_type);
112
113        quote! {
114            match #target_type::deserialize_bytes(reader, bytes) {
115                Ok(value) => return Ok(Self::#variant_ident(value)),
116                Err(error) => errors.push(Box::new(error)),
117            }
118        }
119    }
120}
121
122/* DynamicType */
123
124impl DynamicData<'_> {
125    pub(crate) fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
126        self.render_with_deserializer(ctx);
127        self.render_deserializer_types(ctx);
128        self.render_deserializer_impls(ctx);
129    }
130
131    fn render_with_deserializer(&self, ctx: &mut Context<'_, '_>) {
132        let Self {
133            type_ident,
134            deserializer_ident,
135            ..
136        } = self;
137        let xsd_parser = &ctx.xsd_parser_crate;
138        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
139        let deserializer_type = if boxed_deserializer {
140            quote!(Box<quick_xml_deserialize::#deserializer_ident>)
141        } else {
142            quote!(quick_xml_deserialize::#deserializer_ident)
143        };
144
145        let usings = [quote!(#xsd_parser::quick_xml::WithDeserializer)];
146        let code = quote! {
147            impl WithDeserializer for #type_ident {
148                type Deserializer = #deserializer_type;
149            }
150        };
151
152        ctx.module().usings(usings).append(code);
153    }
154
155    fn render_deserializer_types(&self, ctx: &mut Context<'_, '_>) {
156        let Self {
157            derived_types,
158            deserializer_ident,
159            ..
160        } = self;
161
162        let xsd_parser = &ctx.xsd_parser_crate;
163
164        let variants = derived_types.iter().map(|x| {
165            let target_type = ctx.resolve_type_for_deserialize_module(&x.target_type);
166            let variant_ident = &x.variant_ident;
167
168            quote! {
169                #variant_ident(<#target_type as WithDeserializer>::Deserializer),
170            }
171        });
172
173        let usings = [quote!(#xsd_parser::quick_xml::WithDeserializer)];
174        let code = quote! {
175            #[derive(Debug)]
176            pub enum #deserializer_ident {
177                #( #variants )*
178            }
179        };
180
181        ctx.quick_xml_deserialize().usings(usings).append(code);
182    }
183
184    fn render_deserializer_impls(&self, ctx: &mut Context<'_, '_>) {
185        let Self {
186            type_ident,
187            derived_types,
188            deserializer_ident,
189            ..
190        } = self;
191
192        let xsd_parser = &ctx.xsd_parser_crate;
193
194        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
195        let deserializer_type = if boxed_deserializer {
196            quote!(Box<#deserializer_ident>)
197        } else {
198            quote!(#deserializer_ident)
199        };
200        let boxed_deserializer_ident =
201            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
202        let deref_self = boxed_deserializer.then(|| quote!(*));
203
204        let variants_init = derived_types
205            .iter()
206            .map(|x| x.render_deserializer_init(ctx, type_ident, deserializer_ident));
207        let variants_next = derived_types
208            .iter()
209            .map(|x| x.render_deserializer_next(ctx, type_ident, deserializer_ident));
210        let variants_finish = derived_types.iter().map(|x| {
211            let variant_ident = &x.variant_ident;
212
213            quote! {
214                #boxed_deserializer_ident::#variant_ident(x) => Ok(super::#type_ident(Box::new(x.finish(reader)?))),
215            }
216        });
217
218        let usings = [
219            quote!(#xsd_parser::quick_xml::Event),
220            quote!(#xsd_parser::quick_xml::Error),
221            quote!(#xsd_parser::quick_xml::Deserializer),
222            quote!(#xsd_parser::quick_xml::DeserializerEvent),
223            quote!(#xsd_parser::quick_xml::DeserializeReader),
224            quote!(#xsd_parser::quick_xml::DeserializerResult),
225            quote!(#xsd_parser::quick_xml::DeserializerOutput),
226            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
227        ];
228        let code = quote! {
229            impl<'de> Deserializer<'de, super::#type_ident> for #deserializer_type {
230                fn init<R>(
231                    reader: &R,
232                    event: Event<'de>,
233                ) -> DeserializerResult<'de, super::#type_ident>
234                where
235                    R: DeserializeReader,
236                {
237                    let Some(type_name) = reader.get_dynamic_type_name(&event)? else {
238                        return Ok(DeserializerOutput {
239                            artifact: DeserializerArtifact::None,
240                            event: DeserializerEvent::None,
241                            allow_any: false,
242                        });
243                    };
244                    let type_name = type_name.into_owned();
245
246                    #( #variants_init )*
247
248                    Ok(DeserializerOutput {
249                        artifact: DeserializerArtifact::None,
250                        event: DeserializerEvent::Break(event),
251                        allow_any: false,
252                    })
253                }
254
255                fn next<R>(
256                    self,
257                    reader: &R,
258                    event: Event<'de>
259                ) -> DeserializerResult<'de, super::#type_ident>
260                where
261                    R: DeserializeReader
262                {
263                    match #deref_self self {
264                        #( #variants_next )*
265                    }
266                }
267
268                fn finish<R>(
269                    self,
270                    reader: &R
271                ) -> Result<super::#type_ident, Error>
272                where
273                    R: DeserializeReader
274                {
275                    match #deref_self self {
276                        #( #variants_finish )*
277                    }
278                }
279            }
280        };
281
282        ctx.quick_xml_deserialize().usings(usings).append(code);
283    }
284}
285
286impl DerivedType {
287    fn render_deserializer_init(
288        &self,
289        ctx: &Context<'_, '_>,
290        type_ident: &Ident2,
291        deserializer_ident: &Ident2,
292    ) -> TokenStream {
293        let Self {
294            ident,
295            b_name,
296            target_type,
297            variant_ident,
298            ..
299        } = self;
300
301        let xsd_parser = &ctx.xsd_parser_crate;
302        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
303        let boxed_deserializer_ident =
304            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
305        let deserialize_mapper = do_box(
306            boxed_deserializer,
307            quote!(#boxed_deserializer_ident::#variant_ident(x)),
308        );
309        let target_type = ctx.resolve_type_for_deserialize_module(target_type);
310
311        ctx.add_quick_xml_deserialize_usings([
312            quote!(#xsd_parser::quick_xml::QName),
313            quote!(#xsd_parser::quick_xml::WithDeserializer),
314            quote!(#xsd_parser::quick_xml::DeserializerOutput),
315        ]);
316
317        let body = quote! {
318            let DeserializerOutput {
319                artifact,
320                event,
321                allow_any,
322            } = <#target_type as WithDeserializer>::Deserializer::init(reader, event)?;
323
324            return Ok(DeserializerOutput {
325                artifact: artifact.map(
326                    |x| super::#type_ident(Box::new(x)),
327                    |x| #deserialize_mapper,
328                ),
329                event,
330                allow_any,
331            });
332        };
333
334        if let Some(module) = ident
335            .ns
336            .and_then(|ns| ctx.types.meta.types.modules.get(&ns))
337        {
338            let ns_name = ctx.resolve_type_for_deserialize_module(&module.make_ns_const());
339
340            quote! {
341                if matches!(reader.resolve_local_name(QName(&type_name), &#ns_name), Some(#b_name)) {
342                    #body
343                }
344            }
345        } else {
346            quote! {
347                if type_name == #b_name {
348                    #body
349                }
350            }
351        }
352    }
353
354    fn render_deserializer_next(
355        &self,
356        ctx: &Context<'_, '_>,
357        type_ident: &Ident2,
358        deserializer_ident: &Ident2,
359    ) -> TokenStream {
360        let Self { variant_ident, .. } = self;
361
362        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
363        let boxed_deserializer_ident =
364            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
365        let deserialize_mapper = do_box(
366            boxed_deserializer,
367            quote!(#boxed_deserializer_ident::#variant_ident(x)),
368        );
369
370        quote! {
371            #boxed_deserializer_ident::#variant_ident(x) => {
372                let DeserializerOutput {
373                    artifact,
374                    event,
375                    allow_any,
376                } = x.next(reader, event)?;
377
378                Ok(DeserializerOutput {
379                    artifact: artifact.map(
380                        |x| super::#type_ident(Box::new(x)),
381                        |x| #deserialize_mapper,
382                    ),
383                    event,
384                    allow_any,
385                })
386            },
387        }
388    }
389}
390
391/* ReferenceType */
392
393impl ReferenceData<'_> {
394    pub(crate) fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
395        let Self {
396            mode,
397            occurs,
398            type_ident,
399            target_type,
400            ..
401        } = self;
402
403        if matches!(mode, TypedefMode::Auto | TypedefMode::Typedef) {
404            return;
405        }
406
407        let target_type = ctx.resolve_type_for_module(target_type);
408        let xsd_parser = &ctx.xsd_parser_crate;
409        let body = match occurs {
410            Occurs::None => return,
411            Occurs::Single => {
412                quote! {
413                    Ok(Self(#target_type::deserialize_bytes(reader, bytes)?))
414                }
415            }
416            Occurs::Optional => {
417                quote! {
418                    Ok(Self(Some(#target_type::deserialize_bytes(reader, bytes)?)))
419                }
420            }
421            Occurs::DynamicList => {
422                quote! {
423                    Ok(Self(bytes
424                        .split(|b| *b == b' ' || *b == b'|' || *b == b',' || *b == b';')
425                        .map(|bytes| #target_type::deserialize_bytes(reader, bytes))
426                        .collect::<Result<Vec<_>, _>>()?
427                    ))
428                }
429            }
430            Occurs::StaticList(size) => {
431                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
432
433                quote! {
434                    let arr: [Option<#target_type>; #size];
435                    let parts = bytes
436                        .split(|b| *b == b' ' || *b == b'|' || *b == b',' || *b == b';')
437                        .map(|bytes| #target_type::deserialize_bytes(reader, bytes));
438                    let mut index = 0;
439
440                    for part in parts {
441                        if index >= #size {
442                            return Err(reader.map_error(ErrorKind::InsufficientSize {
443                                min: #size,
444                                max: #size,
445                                actual: index,
446                            }));
447                        }
448
449                        arr[index] = Some(part?);
450
451                        index += 1;
452                    }
453
454                    if index < #size {
455                        return Err(reader.map_error(ErrorKind::InsufficientSize {
456                            min: #size,
457                            max: #size,
458                            actual: index,
459                        }));
460                    }
461
462                    Ok(Self(arr.map(|x| x.unwrap())))
463                }
464            }
465        };
466
467        let usings = [
468            quote!(#xsd_parser::quick_xml::Error),
469            quote!(#xsd_parser::quick_xml::DeserializeBytes),
470            quote!(#xsd_parser::quick_xml::DeserializeReader),
471        ];
472        let code = quote! {
473            impl DeserializeBytes for #type_ident {
474                fn deserialize_bytes<R>(
475                    reader: &R,
476                    bytes: &[u8],
477                ) -> Result<Self, Error>
478                where
479                    R: DeserializeReader
480                {
481                    #body
482                }
483            }
484        };
485
486        ctx.module().usings(usings).append(code);
487    }
488}
489
490/* EnumerationType */
491
492impl EnumerationData<'_> {
493    pub(crate) fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
494        let Self {
495            type_ident,
496            variants,
497            ..
498        } = self;
499
500        let xsd_parser = &ctx.xsd_parser_crate;
501
502        let mut other = None;
503        let variants = variants
504            .iter()
505            .filter_map(|v| v.render_deserializer_variant(ctx, &mut other))
506            .collect::<Vec<_>>();
507
508        let other = other.unwrap_or_else(|| {
509            ctx.add_usings([
510                quote!(#xsd_parser::quick_xml::ErrorKind),
511                quote!(#xsd_parser::quick_xml::RawByteStr),
512            ]);
513
514            quote! {
515                x => Err(
516                    reader.map_error(
517                        ErrorKind::UnknownOrInvalidValue(
518                            RawByteStr::from_slice(x)
519                        )
520                    )
521                ),
522            }
523        });
524
525        let usings = [
526            quote!(#xsd_parser::quick_xml::Error),
527            quote!(#xsd_parser::quick_xml::DeserializeBytes),
528            quote!(#xsd_parser::quick_xml::DeserializeReader),
529        ];
530        let code = quote! {
531            impl DeserializeBytes for #type_ident {
532                fn deserialize_bytes<R>(
533                    reader: &R,
534                    bytes: &[u8],
535                ) -> Result<Self, Error>
536                where
537                    R: DeserializeReader
538                {
539                    match bytes {
540                        #( #variants )*
541                        #other
542                    }
543                }
544            }
545        };
546
547        ctx.module().usings(usings).append(code);
548    }
549}
550
551impl EnumerationTypeVariant<'_> {
552    fn render_deserializer_variant(
553        &self,
554        ctx: &Context<'_, '_>,
555        other: &mut Option<TokenStream>,
556    ) -> Option<TokenStream> {
557        let Self {
558            b_name,
559            target_type,
560            variant_ident,
561            ..
562        } = self;
563
564        if let Some(target_type) = target_type {
565            let target_type = ctx.resolve_type_for_module(target_type);
566
567            *other = Some(
568                quote! { x => Ok(Self::#variant_ident(#target_type::deserialize_bytes(reader, x)?)), },
569            );
570
571            return None;
572        }
573
574        Some(quote! {
575            #b_name => Ok(Self::#variant_ident),
576        })
577    }
578}
579
580/* ComplexType */
581
582impl ComplexData<'_> {
583    pub(crate) fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
584        match self {
585            Self::Enum {
586                type_,
587                content_type,
588            } => {
589                type_.render_deserializer(ctx);
590
591                if let Some(content_type) = content_type {
592                    content_type.render_deserializer(ctx);
593                }
594            }
595            Self::Struct {
596                type_,
597                content_type,
598            } => {
599                type_.render_deserializer(ctx);
600
601                if let Some(content_type) = content_type {
602                    content_type.render_deserializer(ctx);
603                }
604            }
605        }
606    }
607}
608
609impl ComplexBase {
610    fn return_end_event(&self, ctx: &Context<'_, '_>) -> (TokenStream, TokenStream) {
611        let xsd_parser = &ctx.xsd_parser_crate;
612        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::DeserializerEvent)]);
613
614        if self.represents_element() {
615            (quote!(), quote!(DeserializerEvent::None))
616        } else {
617            (quote!(event @), quote!(DeserializerEvent::Continue(event)))
618        }
619    }
620
621    fn render_with_deserializer(&self, ctx: &mut Context<'_, '_>) {
622        let Self {
623            type_ident,
624            deserializer_ident,
625            ..
626        } = self;
627        let xsd_parser = &ctx.xsd_parser_crate;
628        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
629        let deserializer_type = if boxed_deserializer {
630            quote!(Box<quick_xml_deserialize::#deserializer_ident>)
631        } else {
632            quote!(quick_xml_deserialize::#deserializer_ident)
633        };
634
635        let usings = [quote!(#xsd_parser::quick_xml::WithDeserializer)];
636        let code = quote! {
637            impl WithDeserializer for #type_ident {
638                type Deserializer = #deserializer_type;
639            }
640        };
641
642        ctx.module().usings(usings).append(code);
643    }
644
645    fn render_deserializer_impl(
646        &self,
647        ctx: &mut Context<'_, '_>,
648        fn_init: &TokenStream,
649        fn_next: &TokenStream,
650        fn_finish: &TokenStream,
651        finish_mut_self: bool,
652    ) {
653        let xsd_parser = &ctx.xsd_parser_crate;
654        let type_ident = &self.type_ident;
655        let deserializer_ident = &self.deserializer_ident;
656        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
657        let deserializer_type = if boxed_deserializer {
658            quote!(Box<#deserializer_ident>)
659        } else {
660            quote!(#deserializer_ident)
661        };
662        let mut_ = finish_mut_self.then(|| quote!(mut));
663
664        let usings = [
665            quote!(#xsd_parser::quick_xml::Event),
666            quote!(#xsd_parser::quick_xml::Error),
667            quote!(#xsd_parser::quick_xml::Deserializer),
668            quote!(#xsd_parser::quick_xml::DeserializeReader),
669            quote!(#xsd_parser::quick_xml::DeserializerResult),
670        ];
671
672        let code = quote! {
673            impl<'de> Deserializer<'de, super::#type_ident> for #deserializer_type {
674                fn init<R>(
675                    reader: &R,
676                    event: Event<'de>,
677                ) -> DeserializerResult<'de, super::#type_ident>
678                where
679                    R: DeserializeReader,
680                {
681                    #fn_init
682                }
683
684                fn next<R>(
685                    mut self,
686                    reader: &R,
687                    event: Event<'de>,
688                ) -> DeserializerResult<'de, super::#type_ident>
689                where
690                    R: DeserializeReader,
691                {
692                    #fn_next
693                }
694
695                fn finish<R>(#mut_ self, reader: &R) -> Result<super::#type_ident, Error>
696                where
697                    R: DeserializeReader,
698                {
699                    #fn_finish
700                }
701            }
702        };
703
704        ctx.quick_xml_deserialize().usings(usings).append(code);
705    }
706
707    fn render_deserializer_fn_init_for_element(&self, ctx: &Context<'_, '_>) -> TokenStream {
708        let _ctx = ctx;
709        let deserializer_ident = &self.deserializer_ident;
710        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
711        let boxed_deserializer_ident =
712            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
713
714        quote! {
715            reader.init_deserializer_from_start_event(event, #boxed_deserializer_ident::from_bytes_start)
716        }
717    }
718}
719
720impl ComplexDataEnum<'_> {
721    fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
722        self.render_with_deserializer(ctx);
723        self.render_deserializer_type(ctx);
724        self.render_deserializer_state_type(ctx);
725        self.render_deserializer_helper(ctx);
726        self.render_deserializer_impl(ctx);
727    }
728
729    fn render_deserializer_type(&self, ctx: &mut Context<'_, '_>) {
730        let deserializer_ident = &self.deserializer_ident;
731        let deserializer_state_ident = &self.deserializer_state_ident;
732
733        let code = quote! {
734            #[derive(Debug)]
735            pub struct #deserializer_ident {
736                state: Box<#deserializer_state_ident>,
737            }
738        };
739
740        ctx.quick_xml_deserialize().append(code);
741    }
742
743    fn render_deserializer_state_type(&self, ctx: &mut Context<'_, '_>) {
744        let type_ident = &self.type_ident;
745        let deserializer_state_ident = &self.deserializer_state_ident;
746        let variants = self
747            .elements
748            .iter()
749            .map(|x| x.deserializer_enum_variant_decl(ctx));
750
751        let code = quote! {
752            #[derive(Debug)]
753            pub enum #deserializer_state_ident {
754                Init__,
755                #( #variants )*
756                Done__(super::#type_ident),
757                Unknown__,
758            }
759        };
760
761        ctx.quick_xml_deserialize().append(code);
762    }
763
764    fn render_deserializer_helper(&self, ctx: &mut Context<'_, '_>) {
765        let represents_element = self.represents_element();
766        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
767        let deserializer_ident = &self.deserializer_ident;
768        let deserializer_state_ident = &self.deserializer_state_ident;
769
770        let fn_find_suitable = self.render_deserializer_fn_find_suitable(ctx);
771        let fn_from_bytes_start =
772            represents_element.then(|| self.render_deserializer_fn_from_bytes_start(ctx));
773        let fn_finish_state = self.render_deserializer_fn_finish_state(ctx);
774
775        let store_elements = self
776            .elements
777            .iter()
778            .map(|x| x.deserializer_enum_variant_fn_store(ctx));
779        let handle_elements = self.elements.iter().map(|x| {
780            x.deserializer_enum_variant_fn_handle(
781                ctx,
782                represents_element,
783                &boxed_deserializer_ident(boxed_deserializer, deserializer_ident),
784                deserializer_state_ident,
785            )
786        });
787
788        let code = quote! {
789            impl #deserializer_ident {
790                #fn_find_suitable
791                #fn_from_bytes_start
792                #fn_finish_state
793
794                #( #store_elements )*
795                #( #handle_elements )*
796            }
797        };
798
799        ctx.quick_xml_deserialize().append(code);
800    }
801
802    fn render_deserializer_fn_find_suitable(&self, ctx: &Context<'_, '_>) -> TokenStream {
803        let allow_any = self.allow_any;
804        let xsd_parser = &ctx.xsd_parser_crate;
805        let deserializer_state_ident = &self.deserializer_state_ident;
806
807        let elements = self
808            .elements
809            .iter()
810            .filter_map(|x| x.deserializer_enum_variant_init_element(ctx))
811            .collect::<Vec<_>>();
812        let groups = self
813            .elements
814            .iter()
815            .filter_map(|x| x.deserializer_enum_variant_init_group(ctx, !allow_any))
816            .collect::<Vec<_>>();
817        let any = self
818            .elements
819            .iter()
820            .filter_map(|x| x.deserializer_enum_variant_init_any(ctx))
821            .collect::<Vec<_>>();
822
823        let x = if elements.is_empty() {
824            quote!(_)
825        } else {
826            quote!(x)
827        };
828
829        let (allow_any_result, allow_any_decl) = if groups.is_empty() || allow_any {
830            (quote!(#allow_any), None)
831        } else {
832            (
833                quote!(allow_any_element),
834                Some(quote!(let mut allow_any_element = false;)),
835            )
836        };
837
838        ctx.add_quick_xml_deserialize_usings([
839            quote!(#xsd_parser::quick_xml::Error),
840            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
841            quote!(#xsd_parser::quick_xml::DeserializerOutput),
842            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
843        ]);
844
845        quote! {
846            fn find_suitable<'de, R>(
847                &mut self,
848                reader: &R,
849                event: Event<'de>,
850                fallback: &mut Option<#deserializer_state_ident>,
851            ) -> Result<ElementHandlerOutput<'de>, Error>
852            where
853                R: DeserializeReader,
854            {
855                let (Event::Start(#x) | Event::Empty(#x)) = &event else {
856                    *self.state = fallback.take().unwrap_or(#deserializer_state_ident::Init__);
857
858                    return Ok(ElementHandlerOutput::return_to_parent(event, #allow_any));
859                };
860
861                #allow_any_decl
862
863                #( #elements )*
864                #( #groups )*
865                #( #any )*
866
867                *self.state = fallback.take().unwrap_or(#deserializer_state_ident::Init__);
868
869                Ok(ElementHandlerOutput::return_to_parent(event, #allow_any_result))
870            }
871        }
872    }
873
874    fn render_deserializer_fn_from_bytes_start(&self, ctx: &Context<'_, '_>) -> TokenStream {
875        let xsd_parser = &ctx.xsd_parser_crate;
876        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
877        let deserializer_state_ident = &self.deserializer_state_ident;
878
879        let self_type = if boxed_deserializer {
880            quote!(Box<Self>)
881        } else {
882            quote!(Self)
883        };
884
885        let self_ctor = do_box(
886            boxed_deserializer,
887            quote! {
888                Self {
889                    state: Box::new(#deserializer_state_ident::Init__)
890                }
891            },
892        );
893
894        let attrib_loop = self.allow_any_attribute.not().then(|| {
895            ctx.add_quick_xml_deserialize_usings([
896                quote!(#xsd_parser::quick_xml::filter_xmlns_attributes),
897            ]);
898
899            quote! {
900                for attrib in filter_xmlns_attributes(bytes_start) {
901                    let attrib = attrib?;
902                    reader.raise_unexpected_attrib(attrib)?;
903                }
904            }
905        });
906
907        ctx.add_quick_xml_deserialize_usings([
908            quote!(#xsd_parser::quick_xml::Error),
909            quote!(#xsd_parser::quick_xml::BytesStart),
910            quote!(#xsd_parser::quick_xml::DeserializeReader),
911        ]);
912
913        quote! {
914            fn from_bytes_start<R>(
915                reader: &R,
916                bytes_start: &BytesStart<'_>
917            ) -> Result<#self_type, Error>
918            where
919                R: DeserializeReader,
920            {
921                #attrib_loop
922
923                Ok(#self_ctor)
924            }
925        }
926    }
927
928    fn render_deserializer_fn_finish_state(&self, ctx: &Context<'_, '_>) -> TokenStream {
929        let xsd_parser = &ctx.xsd_parser_crate;
930        let type_ident = &self.type_ident;
931        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
932        let deserializer_ident = &self.deserializer_ident;
933        let deserializer_state_ident = &self.deserializer_state_ident;
934
935        let finish_elements = self.elements.iter().map(|x| {
936            x.deserializer_enum_variant_finish(
937                ctx,
938                type_ident,
939                &boxed_deserializer_ident(boxed_deserializer, deserializer_ident),
940            )
941        });
942
943        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
944
945        quote! {
946            fn finish_state<R>(reader: &R, state: #deserializer_state_ident) -> Result<super::#type_ident, Error>
947            where
948                R: DeserializeReader,
949            {
950                use #deserializer_state_ident as S;
951
952                match state {
953                    S::Init__ => Err(ErrorKind::MissingContent.into()),
954                    #( #finish_elements )*
955                    S::Done__(data) => Ok(data),
956                    S::Unknown__ => unreachable!(),
957                }
958            }
959        }
960    }
961
962    fn render_deserializer_impl(&self, ctx: &mut Context<'_, '_>) {
963        let fn_init = self.render_deserializer_fn_init(ctx);
964        let fn_next = self.render_deserializer_fn_next(ctx);
965        let fn_finish = self.render_deserializer_fn_finish(ctx);
966
967        self.base
968            .render_deserializer_impl(ctx, &fn_init, &fn_next, &fn_finish, false);
969    }
970
971    fn render_deserializer_fn_init(&self, ctx: &Context<'_, '_>) -> TokenStream {
972        if self.represents_element() {
973            self.render_deserializer_fn_init_for_element(ctx)
974        } else {
975            self.render_deserializer_fn_init_for_group(ctx)
976        }
977    }
978
979    fn render_deserializer_fn_init_for_group(&self, ctx: &Context<'_, '_>) -> TokenStream {
980        let _self = self;
981
982        let xsd_parser = &ctx.xsd_parser_crate;
983        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
984        let deserializer_ident = &self.deserializer_ident;
985        let boxed_deserializer_ident =
986            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
987        let deserializer_state_ident = &self.deserializer_state_ident;
988
989        let init_deserializer = do_box(
990            boxed_deserializer,
991            quote! {
992                #boxed_deserializer_ident {
993                    state: Box::new(#deserializer_state_ident::Init__),
994                }
995            },
996        );
997
998        ctx.add_quick_xml_deserialize_usings([
999            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1000        ]);
1001
1002        quote! {
1003            let deserializer = #init_deserializer;
1004            let mut output = deserializer.next(reader, event)?;
1005
1006            output.artifact = match output.artifact {
1007                DeserializerArtifact::Deserializer(x) if matches!(&*x.state, #deserializer_state_ident::Init__) => DeserializerArtifact::None,
1008                artifact => artifact,
1009            };
1010
1011            Ok(output)
1012        }
1013    }
1014
1015    fn render_deserializer_fn_next(&self, ctx: &Context<'_, '_>) -> TokenStream {
1016        let xsd_parser = &ctx.xsd_parser_crate;
1017        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
1018        let deserializer_ident =
1019            boxed_deserializer_ident(boxed_deserializer, &self.deserializer_ident);
1020        let deserializer_state_ident = &self.deserializer_state_ident;
1021        let (event_at, return_end_event) = self.return_end_event(ctx);
1022
1023        let handlers_continue = self
1024            .elements
1025            .iter()
1026            .map(|x| x.deserializer_enum_variant_fn_next_continue(ctx));
1027        let handlers_create = self
1028            .elements
1029            .iter()
1030            .map(|x| x.deserializer_enum_variant_fn_next_create(ctx));
1031
1032        ctx.add_quick_xml_deserialize_usings([
1033            quote!(core::mem::replace),
1034            quote!(#xsd_parser::quick_xml::DeserializerEvent),
1035            quote!(#xsd_parser::quick_xml::DeserializerOutput),
1036            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1037            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
1038        ]);
1039
1040        quote! {
1041            use #deserializer_state_ident as S;
1042
1043            let mut event = event;
1044            let mut fallback = None;
1045
1046            let (event, allow_any) = loop {
1047                let state = replace(&mut *self.state, S::Unknown__);
1048                event = match (state, event) {
1049                    #( #handlers_continue )*
1050                    (state, #event_at Event::End(_)) => {
1051                        return Ok(DeserializerOutput {
1052                            artifact: DeserializerArtifact::Data(#deserializer_ident::finish_state(reader, state)?),
1053                            event: #return_end_event,
1054                            allow_any: false,
1055                        });
1056                    }
1057                    (S::Init__, event) => match self.find_suitable(reader, event, &mut fallback)? {
1058                        ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
1059                        ElementHandlerOutput::Continue { event, .. } => event,
1060                    },
1061                    #( #handlers_create )*
1062                    (s @ S::Done__(_), event) => {
1063                        *self.state = s;
1064
1065                        break (DeserializerEvent::Continue(event), false);
1066                    },
1067                    (S::Unknown__, _) => unreachable!(),
1068                }
1069            };
1070
1071            let artifact = if matches!(&*self.state, S::Done__(_)) {
1072                DeserializerArtifact::Data(self.finish(reader)?)
1073            } else {
1074                DeserializerArtifact::Deserializer(self)
1075            };
1076
1077            Ok(DeserializerOutput {
1078                artifact,
1079                event,
1080                allow_any,
1081            })
1082        }
1083    }
1084
1085    fn render_deserializer_fn_finish(&self, ctx: &Context<'_, '_>) -> TokenStream {
1086        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
1087        let deserializer_ident =
1088            boxed_deserializer_ident(boxed_deserializer, &self.deserializer_ident);
1089
1090        quote! {
1091            #deserializer_ident::finish_state(reader, *self.state)
1092        }
1093    }
1094}
1095
1096impl ComplexDataStruct<'_> {
1097    fn render_deserializer(&self, ctx: &mut Context<'_, '_>) {
1098        self.render_with_deserializer(ctx);
1099        self.render_deserializer_type(ctx);
1100        self.render_deserializer_state_type(ctx);
1101        self.render_deserializer_helper(ctx);
1102        self.render_deserializer_impl(ctx);
1103    }
1104
1105    fn render_deserializer_type(&self, ctx: &mut Context<'_, '_>) {
1106        let deserializer_ident = &self.deserializer_ident;
1107        let deserializer_state_ident = &self.deserializer_state_ident;
1108        let attributes = self
1109            .attributes
1110            .iter()
1111            .map(|x| x.deserializer_struct_field_decl(ctx));
1112        let elements = self
1113            .elements()
1114            .iter()
1115            .map(|x| x.deserializer_struct_field_decl(ctx));
1116        let content = self.content().map(|x| x.deserializer_field_decl(ctx));
1117
1118        let code = quote! {
1119            #[derive(Debug)]
1120            pub struct #deserializer_ident {
1121                #( #attributes )*
1122                #( #elements )*
1123                #content
1124                state: Box<#deserializer_state_ident>,
1125            }
1126        };
1127
1128        ctx.quick_xml_deserialize().append(code);
1129    }
1130
1131    fn render_deserializer_state_type(&self, ctx: &mut Context<'_, '_>) {
1132        let xsd_parser = &ctx.xsd_parser_crate;
1133        let deserializer_state_ident = &self.deserializer_state_ident;
1134
1135        let mut use_with_deserializer = Some(quote!(#xsd_parser::quick_xml::WithDeserializer));
1136
1137        let variants = match &self.mode {
1138            StructMode::Empty { .. } => {
1139                use_with_deserializer = None;
1140
1141                quote! {
1142                    Init__,
1143                    Unknown__,
1144                }
1145            }
1146            StructMode::Content { content } => {
1147                let target_type = ctx.resolve_type_for_deserialize_module(&content.target_type);
1148
1149                let next = content.need_next_state().then(|| {
1150                    quote! {
1151                        Next__,
1152                    }
1153                });
1154                let done = content.need_done_state(self.represents_element()).then(|| {
1155                    quote! {
1156                        Done__,
1157                    }
1158                });
1159
1160                quote! {
1161                    Init__,
1162                    #next
1163                    Content__(<#target_type as WithDeserializer>::Deserializer),
1164                    #done
1165                    Unknown__,
1166                }
1167            }
1168            StructMode::All { elements, .. } => {
1169                let variants = elements.iter().map(|element| {
1170                    let target_type = ctx.resolve_type_for_deserialize_module(&element.target_type);
1171                    let variant_ident = &element.variant_ident;
1172
1173                    quote! {
1174                        #variant_ident(<#target_type as WithDeserializer>::Deserializer),
1175                    }
1176                });
1177
1178                quote! {
1179                    Init__,
1180                    Next__,
1181                    #( #variants )*
1182                    Unknown__,
1183                }
1184            }
1185            StructMode::Sequence { elements, .. } => {
1186                let variants = elements.iter().map(|element| {
1187                    let target_type = ctx.resolve_type_for_deserialize_module(&element.target_type);
1188                    let variant_ident = &element.variant_ident;
1189
1190                    quote! {
1191                        #variant_ident(Option<<#target_type as WithDeserializer>::Deserializer>),
1192                    }
1193                });
1194
1195                quote! {
1196                    Init__,
1197                    #( #variants )*
1198                    Done__,
1199                    Unknown__,
1200                }
1201            }
1202        };
1203
1204        let code = quote! {
1205            #[derive(Debug)]
1206            enum #deserializer_state_ident {
1207                #variants
1208            }
1209        };
1210
1211        ctx.quick_xml_deserialize()
1212            .usings(use_with_deserializer)
1213            .append(code);
1214    }
1215
1216    fn render_deserializer_helper(&self, ctx: &mut Context<'_, '_>) {
1217        let type_ident = &self.type_ident;
1218        let represents_element = self.represents_element();
1219        let deserializer_ident = &self.deserializer_ident;
1220        let deserializer_state_ident = &self.deserializer_state_ident;
1221
1222        let fn_find_suitable = matches!(&self.mode, StructMode::All { .. })
1223            .then(|| self.render_deserializer_fn_find_suitable(ctx));
1224        let fn_from_bytes_start = self
1225            .represents_element()
1226            .then(|| self.render_deserializer_fn_from_bytes_start(ctx));
1227        let fn_finish_state = self.render_deserializer_fn_finish_state(ctx);
1228
1229        let store_content = self
1230            .content()
1231            .map(|x| x.deserializer_struct_field_fn_store(ctx));
1232        let handle_content = self.content().map(|x| {
1233            x.deserializer_struct_field_fn_handle(
1234                ctx,
1235                type_ident,
1236                represents_element,
1237                deserializer_state_ident,
1238            )
1239        });
1240
1241        let elements = self.elements();
1242        let store_elements = elements
1243            .iter()
1244            .map(|x| x.deserializer_struct_field_fn_store(ctx));
1245        let handle_elements = elements.iter().enumerate().map(|(i, x)| {
1246            let next = elements.get(i + 1);
1247
1248            if let StructMode::All { .. } = &self.mode {
1249                x.deserializer_struct_field_fn_handle_all(ctx, deserializer_state_ident)
1250            } else {
1251                x.deserializer_struct_field_fn_handle_sequence(ctx, next, deserializer_state_ident)
1252            }
1253        });
1254
1255        let code = quote! {
1256            impl #deserializer_ident {
1257                #fn_find_suitable
1258                #fn_from_bytes_start
1259                #fn_finish_state
1260
1261                #store_content
1262                #handle_content
1263
1264                #( #store_elements )*
1265                #( #handle_elements )*
1266            }
1267        };
1268
1269        ctx.quick_xml_deserialize().append(code);
1270    }
1271
1272    fn render_deserializer_fn_find_suitable(&self, ctx: &Context<'_, '_>) -> TokenStream {
1273        let allow_any = self.allow_any();
1274        let xsd_parser = &ctx.xsd_parser_crate;
1275        let deserializer_state_ident = &self.deserializer_state_ident;
1276
1277        let elements = self
1278            .elements()
1279            .iter()
1280            .filter_map(|x| x.deserializer_struct_field_init_element(ctx));
1281        let groups = self
1282            .elements()
1283            .iter()
1284            .filter_map(|x| x.deserializer_struct_field_init_group(ctx, !allow_any))
1285            .collect::<Vec<_>>();
1286
1287        let (allow_any_result, allow_any_decl) = if groups.is_empty() || allow_any {
1288            (quote!(#allow_any), None)
1289        } else {
1290            (
1291                quote!(allow_any_element),
1292                Some(quote!(let mut allow_any_element = false;)),
1293            )
1294        };
1295
1296        ctx.add_quick_xml_deserialize_usings([
1297            quote!(#xsd_parser::quick_xml::Error),
1298            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
1299            quote!(#xsd_parser::quick_xml::DeserializerOutput),
1300            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1301        ]);
1302
1303        quote! {
1304            fn find_suitable<'de, R>(
1305                &mut self,
1306                reader: &R,
1307                event: Event<'de>,
1308                fallback: &mut Option<#deserializer_state_ident>,
1309            ) -> Result<ElementHandlerOutput<'de>, Error>
1310            where
1311                R: DeserializeReader,
1312            {
1313                let (Event::Start(x) | Event::Empty(x)) = &event else {
1314                    *self.state = fallback.take().unwrap_or(#deserializer_state_ident::Init__);
1315
1316                    return Ok(ElementHandlerOutput::return_to_parent(event, #allow_any));
1317                };
1318
1319                #allow_any_decl
1320
1321                #( #elements )*
1322                #( #groups )*
1323
1324                *self.state = fallback.take().unwrap_or(#deserializer_state_ident::Init__);
1325
1326                Ok(ElementHandlerOutput::return_to_parent(event, #allow_any_result))
1327            }
1328        }
1329    }
1330
1331    #[allow(clippy::too_many_lines)]
1332    fn render_deserializer_fn_from_bytes_start(&self, ctx: &Context<'_, '_>) -> TokenStream {
1333        let xsd_parser = &ctx.xsd_parser_crate;
1334        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
1335        let deserializer_state_ident = &self.deserializer_state_ident;
1336
1337        let mut index = 0;
1338        let mut any_attribute = None;
1339
1340        let attrib_var = self.attributes.iter().map(|x| x.deserializer_var_decl(ctx));
1341        let attrib_match = self
1342            .attributes
1343            .iter()
1344            .filter_map(|x| x.deserializer_matcher(ctx, &mut index, &mut any_attribute))
1345            .collect::<Vec<_>>();
1346        let attrib_init = self
1347            .attributes
1348            .iter()
1349            .map(|x| x.deserializer_struct_field_init(ctx, &self.type_ident));
1350        let element_init = self
1351            .elements()
1352            .iter()
1353            .map(ComplexDataElement::deserializer_struct_field_init);
1354        let content_init = self
1355            .content()
1356            .map(ComplexDataContent::deserializer_struct_field_init);
1357
1358        let has_normal_attributes = index > 0;
1359        let need_default_handler = !self.allow_any_attribute || any_attribute.is_some();
1360        let default_attrib_handler = need_default_handler.then(|| {
1361            let body = any_attribute
1362                .unwrap_or_else(|| quote! { reader.raise_unexpected_attrib(attrib)?; });
1363
1364            if has_normal_attributes {
1365                quote! {
1366                    else {
1367                        #body
1368                    }
1369                }
1370            } else {
1371                body
1372            }
1373        });
1374
1375        let need_attrib_loop = self.has_attributes() || default_attrib_handler.is_some();
1376        let attrib_loop = need_attrib_loop.then(|| {
1377            ctx.add_quick_xml_deserialize_usings([
1378                quote!(#xsd_parser::quick_xml::filter_xmlns_attributes),
1379            ]);
1380
1381            quote! {
1382                for attrib in filter_xmlns_attributes(bytes_start) {
1383                    let attrib = attrib?;
1384
1385                    #( #attrib_match )*
1386
1387                    #default_attrib_handler
1388                }
1389            }
1390        });
1391
1392        let self_type = if boxed_deserializer {
1393            quote!(Box<Self>)
1394        } else {
1395            quote!(Self)
1396        };
1397
1398        let self_ctor = do_box(
1399            boxed_deserializer,
1400            quote! {
1401                Self {
1402                    #( #attrib_init )*
1403                    #( #element_init )*
1404                    #content_init
1405                    state: Box::new(#deserializer_state_ident::Init__),
1406                }
1407            },
1408        );
1409
1410        ctx.add_quick_xml_deserialize_usings([
1411            quote!(#xsd_parser::quick_xml::Error),
1412            quote!(#xsd_parser::quick_xml::BytesStart),
1413            quote!(#xsd_parser::quick_xml::DeserializeReader),
1414        ]);
1415
1416        quote! {
1417            fn from_bytes_start<R>(
1418                reader: &R,
1419                bytes_start: &BytesStart<'_>
1420            ) -> Result<#self_type, Error>
1421            where
1422                R: DeserializeReader,
1423            {
1424                #( #attrib_var )*
1425
1426                #attrib_loop
1427
1428                Ok(#self_ctor)
1429            }
1430        }
1431    }
1432
1433    fn render_deserializer_fn_finish_state(&self, ctx: &Context<'_, '_>) -> TokenStream {
1434        let xsd_parser = &ctx.xsd_parser_crate;
1435        let deserializer_state_ident = &self.deserializer_state_ident;
1436
1437        let body = match &self.mode {
1438            StructMode::All { elements, .. } => {
1439                let elements = elements
1440                    .iter()
1441                    .map(|x| x.deserializer_struct_field_finish_state_all());
1442
1443                quote! {
1444                    use #deserializer_state_ident as S;
1445
1446                    match state {
1447                        #( #elements )*
1448                        _ => (),
1449                    }
1450
1451                    Ok(())
1452                }
1453            }
1454            StructMode::Sequence { elements, .. } => {
1455                let elements = elements
1456                    .iter()
1457                    .map(|x| x.deserializer_struct_field_finish_state_sequence());
1458
1459                quote! {
1460                    use #deserializer_state_ident as S;
1461
1462                    match state {
1463                        #( #elements )*
1464                        _ => (),
1465                    }
1466
1467                    Ok(())
1468                }
1469            }
1470            StructMode::Content { .. } => {
1471                quote! {
1472                    if let #deserializer_state_ident::Content__(deserializer) = state {
1473                        self.store_content(deserializer.finish(reader)?)?;
1474                    }
1475
1476                    Ok(())
1477                }
1478            }
1479            _ => quote! { Ok(()) },
1480        };
1481
1482        ctx.add_quick_xml_deserialize_usings([
1483            quote!(#xsd_parser::quick_xml::Error),
1484            quote!(#xsd_parser::quick_xml::DeserializeReader),
1485        ]);
1486
1487        quote! {
1488            fn finish_state<R>(&mut self, reader: &R, state: #deserializer_state_ident) -> Result<(), Error>
1489            where
1490                R: DeserializeReader,
1491            {
1492                #body
1493            }
1494        }
1495    }
1496
1497    fn render_deserializer_impl(&self, ctx: &mut Context<'_, '_>) {
1498        let fn_init = self.render_deserializer_fn_init(ctx);
1499        let fn_next = self.render_deserializer_fn_next(ctx);
1500        let fn_finish = self.render_deserializer_fn_finish(ctx);
1501
1502        self.base
1503            .render_deserializer_impl(ctx, &fn_init, &fn_next, &fn_finish, true);
1504    }
1505
1506    fn render_deserializer_fn_init(&self, ctx: &mut Context<'_, '_>) -> TokenStream {
1507        if matches!(&self.mode, StructMode::Content { content } if content.is_simple) {
1508            self.render_deserializer_fn_init_simple(ctx)
1509        } else if self.represents_element() {
1510            self.render_deserializer_fn_init_for_element(ctx)
1511        } else {
1512            self.render_deserializer_fn_init_for_group(ctx)
1513        }
1514    }
1515
1516    fn render_deserializer_fn_init_simple(&self, ctx: &Context<'_, '_>) -> TokenStream {
1517        let xsd_parser = &ctx.xsd_parser_crate;
1518        let deserializer_ident = &self.deserializer_ident;
1519        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
1520        let boxed_deserializer_ident =
1521            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
1522
1523        ctx.add_quick_xml_deserialize_usings([
1524            quote!(#xsd_parser::quick_xml::Event),
1525            quote!(#xsd_parser::quick_xml::DeserializerEvent),
1526            quote!(#xsd_parser::quick_xml::DeserializerOutput),
1527            quote!(#xsd_parser::quick_xml::ContentDeserializer),
1528            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1529        ]);
1530
1531        quote! {
1532            let (Event::Start(x) | Event::Empty(x)) = &event else {
1533                return Ok(DeserializerOutput {
1534                    artifact: DeserializerArtifact::None,
1535                    event: DeserializerEvent::Break(event),
1536                    allow_any: false,
1537                });
1538            };
1539
1540            #boxed_deserializer_ident::from_bytes_start(reader, x)?.next(reader, event)
1541        }
1542    }
1543
1544    fn render_deserializer_fn_init_for_group(&self, ctx: &Context<'_, '_>) -> TokenStream {
1545        let xsd_parser = &ctx.xsd_parser_crate;
1546        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
1547        let deserializer_ident = &self.deserializer_ident;
1548        let boxed_deserializer_ident =
1549            boxed_deserializer_ident(boxed_deserializer, deserializer_ident);
1550        let deserializer_state_ident = &self.deserializer_state_ident;
1551
1552        let element_init = self
1553            .elements()
1554            .iter()
1555            .map(ComplexDataElement::deserializer_struct_field_init);
1556        let content_init = self
1557            .content()
1558            .map(ComplexDataContent::deserializer_struct_field_init);
1559        let init_deserializer = do_box(
1560            boxed_deserializer,
1561            quote! {
1562                #boxed_deserializer_ident {
1563                    #( #element_init )*
1564                    #content_init
1565                    state: Box::new(#deserializer_state_ident::Init__),
1566                }
1567            },
1568        );
1569
1570        ctx.add_quick_xml_deserialize_usings([
1571            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1572        ]);
1573
1574        quote! {
1575            let deserializer = #init_deserializer;
1576            let mut output = deserializer.next(reader, event)?;
1577
1578            output.artifact = match output.artifact {
1579                DeserializerArtifact::Deserializer(x) if matches!(&*x.state, #deserializer_state_ident::Init__) => DeserializerArtifact::None,
1580                artifact => artifact,
1581            };
1582
1583            Ok(output)
1584        }
1585    }
1586
1587    fn render_deserializer_fn_next(&self, ctx: &Context<'_, '_>) -> TokenStream {
1588        match &self.mode {
1589            StructMode::Empty { allow_any } => {
1590                self.render_deserializer_fn_next_empty(ctx, *allow_any)
1591            }
1592            StructMode::Content { content } => {
1593                if content.is_simple {
1594                    self.render_deserializer_fn_next_content_simple(ctx)
1595                } else {
1596                    self.render_deserializer_fn_next_content_complex(ctx, content)
1597                }
1598            }
1599            StructMode::All { .. } => self.render_deserializer_fn_next_all(ctx),
1600            StructMode::Sequence { .. } => self.render_deserializer_fn_next_sequence(ctx),
1601        }
1602    }
1603
1604    fn render_deserializer_fn_next_empty(
1605        &self,
1606        ctx: &Context<'_, '_>,
1607        allow_any: bool,
1608    ) -> TokenStream {
1609        let _self = self;
1610        let xsd_parser = &ctx.xsd_parser_crate;
1611        let (_, return_end_event) = self.return_end_event(ctx);
1612
1613        ctx.add_quick_xml_deserialize_usings([
1614            quote!(#xsd_parser::quick_xml::Event),
1615            quote!(#xsd_parser::quick_xml::DeserializerEvent),
1616            quote!(#xsd_parser::quick_xml::DeserializerOutput),
1617            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1618        ]);
1619
1620        quote! {
1621            if let Event::End(_) = &event {
1622                Ok(DeserializerOutput {
1623                    artifact: DeserializerArtifact::Data(self.finish(reader)?),
1624                    event: #return_end_event,
1625                    allow_any: false,
1626                })
1627            } else {
1628                Ok(DeserializerOutput {
1629                    artifact: DeserializerArtifact::Deserializer(self),
1630                    event: DeserializerEvent::Break(event),
1631                    allow_any: #allow_any,
1632                })
1633            }
1634        }
1635    }
1636
1637    fn render_deserializer_fn_next_content_simple(&self, ctx: &Context<'_, '_>) -> TokenStream {
1638        let xsd_parser = &ctx.xsd_parser_crate;
1639        let deserializer_state_ident = &self.deserializer_state_ident;
1640
1641        ctx.add_quick_xml_deserialize_usings([
1642            quote!(#xsd_parser::quick_xml::DeserializerOutput),
1643            quote!(#xsd_parser::quick_xml::ContentDeserializer),
1644            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1645        ]);
1646
1647        quote! {
1648            use #deserializer_state_ident as S;
1649
1650            match replace(&mut *self.state, S::Unknown__) {
1651                S::Init__ => {
1652                    let output = ContentDeserializer::init(reader, event)?;
1653                    self.handle_content(reader, output)
1654                }
1655                S::Content__(deserializer) => {
1656                    let output = deserializer.next(reader, event)?;
1657                    self.handle_content(reader, output)
1658                }
1659                S::Unknown__ => unreachable!(),
1660            }
1661        }
1662    }
1663
1664    fn render_deserializer_fn_next_content_complex(
1665        &self,
1666        ctx: &Context<'_, '_>,
1667        content: &ComplexDataContent,
1668    ) -> TokenStream {
1669        let xsd_parser = &ctx.xsd_parser_crate;
1670        let target_type = ctx.resolve_type_for_deserialize_module(&content.target_type);
1671        let (event_at, return_end_event) = self.return_end_event(ctx);
1672        let deserializer_state_ident = &self.deserializer_state_ident;
1673
1674        let has_done_state = content.need_done_state(self.represents_element());
1675        let done_handler = has_done_state.then(|| {
1676            quote! {
1677                (S::Done__, event) => {
1678                    *self.state = S::Done__;
1679
1680                    break (DeserializerEvent::Continue(event), false);
1681                },
1682            }
1683        });
1684        let artifact_handler = if has_done_state {
1685            quote! {
1686                let artifact = match &*self.state {
1687                    S::Done__ => DeserializerArtifact::Data(self.finish(reader)?),
1688                    _ => DeserializerArtifact::Deserializer(self),
1689                };
1690            }
1691        } else {
1692            quote! {
1693                let artifact = DeserializerArtifact::Deserializer(self);
1694            }
1695        };
1696
1697        ctx.add_quick_xml_deserialize_usings([
1698            quote!(#xsd_parser::quick_xml::Event),
1699            quote!(#xsd_parser::quick_xml::WithDeserializer),
1700            quote!(#xsd_parser::quick_xml::DeserializerEvent),
1701            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
1702        ]);
1703
1704        quote! {
1705            use #deserializer_state_ident as S;
1706
1707            let mut event = event;
1708            let mut fallback = None;
1709
1710            let (event, allow_any) = loop {
1711                let state = replace(&mut *self.state, S::Unknown__);
1712
1713                event = match (state, event) {
1714                    (S::Content__(deserializer), event) => {
1715                        let output = deserializer.next(reader, event)?;
1716                        match self.handle_content(reader, output, &mut fallback)? {
1717                            ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
1718                            ElementHandlerOutput::Continue { event, .. } => event,
1719                        }
1720                    }
1721                    (_, #event_at Event::End(_)) => {
1722                        return Ok(DeserializerOutput {
1723                            artifact: DeserializerArtifact::Data(self.finish(reader)?),
1724                            event: #return_end_event,
1725                            allow_any: false,
1726                        });
1727                    }
1728                    (state @ (S::Init__ | S::Next__), event) => {
1729                        fallback.get_or_insert(state);
1730                        let output = <#target_type as WithDeserializer>::Deserializer::init(reader, event)?;
1731                        match self.handle_content(reader, output, &mut fallback)? {
1732                            ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
1733                            ElementHandlerOutput::Continue { event, .. } => event,
1734                        }
1735                    },
1736                    #done_handler
1737                    (S::Unknown__, _) => unreachable!(),
1738                }
1739            };
1740
1741            #artifact_handler
1742
1743            Ok(DeserializerOutput {
1744                artifact,
1745                event,
1746                allow_any,
1747            })
1748        }
1749    }
1750
1751    fn render_deserializer_fn_next_all(&self, ctx: &Context<'_, '_>) -> TokenStream {
1752        let (event_at, return_end_event) = self.return_end_event(ctx);
1753        let deserializer_state_ident = &self.deserializer_state_ident;
1754
1755        let handlers = self
1756            .elements()
1757            .iter()
1758            .map(|x| x.deserializer_struct_field_fn_next_all(ctx));
1759
1760        quote! {
1761            use #deserializer_state_ident as S;
1762
1763            let mut event = event;
1764            let mut fallback = None;
1765
1766            let (event, allow_any) = loop {
1767                let state = replace(&mut *self.state, S::Unknown__);
1768
1769                event = match (state, event) {
1770                    #( #handlers )*
1771                    (_, #event_at Event::End(_)) => {
1772                        return Ok(DeserializerOutput {
1773                            artifact: DeserializerArtifact::Data(self.finish(reader)?),
1774                            event: #return_end_event,
1775                            allow_any: false,
1776                        });
1777                    }
1778                    (state @ (S::Init__ | S::Next__), event) => {
1779                        fallback.get_or_insert(state);
1780                        match self.find_suitable(reader, event, &mut fallback)? {
1781                            ElementHandlerOutput::Continue { event, .. } => event,
1782                            ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
1783                        }
1784                    },
1785                    (S::Unknown__, _) => unreachable!(),
1786                }
1787            };
1788
1789            Ok(DeserializerOutput {
1790                artifact: DeserializerArtifact::Deserializer(self),
1791                event,
1792                allow_any,
1793            })
1794        }
1795    }
1796
1797    #[allow(clippy::too_many_lines)]
1798    fn render_deserializer_fn_next_sequence(&self, ctx: &Context<'_, '_>) -> TokenStream {
1799        let allow_any = self.allow_any();
1800        let xsd_parser = &ctx.xsd_parser_crate;
1801        let (event_at, return_end_event) = self.return_end_event(ctx);
1802        let deserializer_state_ident = &self.deserializer_state_ident;
1803
1804        let elements = self.elements();
1805        let first = elements
1806            .first()
1807            .expect("`Sequence` should always have at least one element!");
1808        let first_ident = &first.variant_ident;
1809
1810        let handlers_continue = elements
1811            .iter()
1812            .map(|x| x.deserializer_struct_field_fn_next_sequence_continue(ctx));
1813        let handlers_create = elements.iter().enumerate().map(|(i, x)| {
1814            let next = elements.get(i + 1);
1815
1816            x.deserializer_struct_field_fn_next_sequence_create(ctx, next, allow_any)
1817        });
1818
1819        ctx.add_quick_xml_deserialize_usings([
1820            quote!(core::mem::replace),
1821            quote!(#xsd_parser::quick_xml::Event),
1822            quote!(#xsd_parser::quick_xml::WithDeserializer),
1823            quote!(#xsd_parser::quick_xml::DeserializerEvent),
1824            quote!(#xsd_parser::quick_xml::DeserializerOutput),
1825            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
1826            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
1827        ]);
1828
1829        let any_retry = self.has_any.then(|| {
1830            quote! {
1831                let mut is_any_retry = false;
1832                let mut any_fallback = None;
1833            }
1834        });
1835
1836        let init_set_any = allow_any.then(|| {
1837            quote! {
1838                allow_any_element = true;
1839            }
1840        });
1841
1842        let done_allow_any = if allow_any {
1843            quote!(true)
1844        } else {
1845            quote!(allow_any_element)
1846        };
1847
1848        let mut handle_done = quote! {
1849            fallback.get_or_insert(S::Done__);
1850            break (DeserializerEvent::Continue(event), #done_allow_any);
1851        };
1852
1853        if self.has_any {
1854            handle_done = quote! {
1855                if let Some(state) = any_fallback.take() {
1856                    is_any_retry = true;
1857
1858                    *self.state = state;
1859
1860                    event
1861                } else {
1862                    #handle_done
1863                }
1864            };
1865        }
1866
1867        quote! {
1868            use #deserializer_state_ident as S;
1869
1870            let mut event = event;
1871            let mut fallback = None;
1872            let mut allow_any_element = false;
1873            #any_retry
1874
1875            let (event, allow_any) = loop {
1876                let state = replace(&mut *self.state, S::Unknown__);
1877
1878                event = match (state, event) {
1879                    #( #handlers_continue )*
1880                    (_, #event_at Event::End(_)) => {
1881                        if let Some(fallback) = fallback.take() {
1882                            self.finish_state(reader, fallback)?;
1883                        }
1884
1885                        return Ok(DeserializerOutput {
1886                            artifact: DeserializerArtifact::Data(self.finish(reader)?),
1887                            event: #return_end_event,
1888                            allow_any: false,
1889                        });
1890                    }
1891                    (S::Init__, event) => {
1892                        #init_set_any
1893
1894                        fallback.get_or_insert(S::Init__);
1895
1896                        *self.state = #deserializer_state_ident::#first_ident(None);
1897
1898                        event
1899                    },
1900                    #( #handlers_create )*
1901                    (S::Done__, event) => {
1902                        #handle_done
1903                    },
1904                    (S::Unknown__, _) => unreachable!(),
1905                    (state, event) => {
1906                        *self.state = state;
1907                        break (DeserializerEvent::Break(event), false);
1908                    }
1909                }
1910            };
1911
1912            if let Some(fallback) = fallback {
1913                *self.state = fallback;
1914            }
1915
1916            Ok(DeserializerOutput {
1917                artifact: DeserializerArtifact::Deserializer(self),
1918                event,
1919                allow_any,
1920            })
1921        }
1922    }
1923
1924    fn render_deserializer_fn_finish(&self, ctx: &Context<'_, '_>) -> TokenStream {
1925        let type_ident = &self.type_ident;
1926        let deserializer_state_ident = &self.deserializer_state_ident;
1927
1928        let attributes = self
1929            .attributes
1930            .iter()
1931            .map(ComplexDataAttribute::deserializer_struct_field_finish);
1932        let elements = self
1933            .elements()
1934            .iter()
1935            .map(|x| x.deserializer_struct_field_finish(ctx));
1936        let content = self
1937            .content()
1938            .map(|x| x.deserializer_struct_field_finish(ctx));
1939
1940        ctx.add_quick_xml_deserialize_usings([quote!(core::mem::replace)]);
1941
1942        quote! {
1943            let state = replace(&mut *self.state, #deserializer_state_ident::Unknown__);
1944            self.finish_state(reader, state)?;
1945
1946            Ok(super::#type_ident {
1947                #( #attributes )*
1948                #( #elements )*
1949                #content
1950            })
1951        }
1952    }
1953}
1954
1955impl ComplexDataContent {
1956    fn need_next_state(&self) -> bool {
1957        !self.is_simple
1958    }
1959
1960    fn need_done_state(&self, represents_element: bool) -> bool {
1961        !self.is_simple && !represents_element && self.max_occurs.is_bounded()
1962    }
1963
1964    fn deserializer_field_decl(&self, ctx: &Context<'_, '_>) -> TokenStream {
1965        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
1966
1967        let target_type = match self.occurs {
1968            Occurs::Single | Occurs::Optional => quote!(Option<#target_type>),
1969            Occurs::DynamicList | Occurs::StaticList(_) => quote!(Vec<#target_type>),
1970            e => crate::unreachable!("{:?}", e),
1971        };
1972
1973        quote! {
1974            content: #target_type,
1975        }
1976    }
1977
1978    fn deserializer_struct_field_init(&self) -> TokenStream {
1979        match self.occurs {
1980            Occurs::None => quote!(),
1981            Occurs::Single | Occurs::Optional => quote!(content: None,),
1982            Occurs::DynamicList | Occurs::StaticList(_) => quote!(content: Vec::new(),),
1983        }
1984    }
1985
1986    fn deserializer_struct_field_finish(&self, ctx: &Context<'_, '_>) -> TokenStream {
1987        let xsd_parser = &ctx.xsd_parser_crate;
1988
1989        let convert = match self.occurs {
1990            Occurs::None => crate::unreachable!(),
1991            Occurs::Single => {
1992                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
1993
1994                quote! {
1995                    self.content.ok_or_else(|| ErrorKind::MissingContent)?
1996                }
1997            }
1998            Occurs::Optional | Occurs::DynamicList => {
1999                quote! { self.content }
2000            }
2001            Occurs::StaticList(sz) => {
2002                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
2003
2004                quote! {
2005                    self.content.try_into().map_err(|vec: Vec<_>| ErrorKind::InsufficientSize {
2006                        min: #sz,
2007                        max: #sz,
2008                        actual: vec.len(),
2009                    })?
2010                }
2011            }
2012        };
2013
2014        quote! {
2015            content: #convert,
2016        }
2017    }
2018
2019    fn deserializer_struct_field_fn_store(&self, ctx: &Context<'_, '_>) -> TokenStream {
2020        let xsd_parser = &ctx.xsd_parser_crate;
2021        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2022
2023        let body = match self.occurs {
2024            Occurs::None => crate::unreachable!(),
2025            Occurs::Single | Occurs::Optional => {
2026                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
2027
2028                quote! {
2029                    if self.content.is_some() {
2030                        Err(ErrorKind::DuplicateContent)?;
2031                    }
2032
2033                    self.content = Some(value);
2034                }
2035            }
2036            Occurs::DynamicList | Occurs::StaticList(_) => quote! {
2037                self.content.push(value);
2038            },
2039        };
2040
2041        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::Error)]);
2042
2043        quote! {
2044            fn store_content(&mut self, value: #target_type) -> Result<(), Error> {
2045                #body
2046
2047                Ok(())
2048            }
2049        }
2050    }
2051
2052    fn deserializer_struct_field_fn_handle(
2053        &self,
2054        ctx: &Context<'_, '_>,
2055        type_ident: &Ident2,
2056        represents_element: bool,
2057        deserializer_state_ident: &Ident2,
2058    ) -> TokenStream {
2059        if self.is_simple {
2060            self.deserializer_struct_field_fn_handle_simple(
2061                ctx,
2062                type_ident,
2063                deserializer_state_ident,
2064            )
2065        } else {
2066            self.deserializer_struct_field_fn_handle_complex(
2067                ctx,
2068                represents_element,
2069                deserializer_state_ident,
2070            )
2071        }
2072    }
2073
2074    fn deserializer_struct_field_fn_handle_simple(
2075        &self,
2076        ctx: &Context<'_, '_>,
2077        type_ident: &Ident2,
2078        deserializer_state_ident: &Ident2,
2079    ) -> TokenStream {
2080        let xsd_parser = &ctx.xsd_parser_crate;
2081        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2082        let boxed_deserializer = ctx.get::<BoxedDeserializer>();
2083        let self_type = boxed_deserializer.then(|| quote!(: Box<Self>));
2084
2085        ctx.add_quick_xml_deserialize_usings([
2086            quote!(#xsd_parser::quick_xml::DeserializeReader),
2087            quote!(#xsd_parser::quick_xml::DeserializerOutput),
2088            quote!(#xsd_parser::quick_xml::DeserializerResult),
2089            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
2090        ]);
2091
2092        quote! {
2093            fn handle_content<'de, R>(
2094                mut self #self_type,
2095                reader: &R,
2096                output: DeserializerOutput<'de, #target_type>,
2097            ) -> DeserializerResult<'de, super::#type_ident>
2098            where
2099                R: DeserializeReader,
2100            {
2101                use #deserializer_state_ident as S;
2102
2103                let DeserializerOutput { artifact, event, allow_any } = output;
2104
2105                match artifact {
2106                    DeserializerArtifact::None => Ok(DeserializerOutput {
2107                        artifact: DeserializerArtifact::None,
2108                        event,
2109                        allow_any,
2110                    }),
2111                    DeserializerArtifact::Data(data) => {
2112                        self.store_content(data)?;
2113                        let data = self.finish(reader)?;
2114
2115                        Ok(DeserializerOutput {
2116                            artifact: DeserializerArtifact::Data(data),
2117                            event,
2118                            allow_any,
2119                        })
2120                    }
2121                    DeserializerArtifact::Deserializer(deserializer) => {
2122                        *self.state = S::Content__(deserializer);
2123
2124                        Ok(DeserializerOutput {
2125                            artifact: DeserializerArtifact::Deserializer(self),
2126                            event,
2127                            allow_any,
2128                        })
2129                    }
2130                }
2131            }
2132        }
2133    }
2134
2135    #[allow(clippy::too_many_lines)]
2136    fn deserializer_struct_field_fn_handle_complex(
2137        &self,
2138        ctx: &Context<'_, '_>,
2139        represents_element: bool,
2140        deserializer_state_ident: &Ident2,
2141    ) -> TokenStream {
2142        let xsd_parser = &ctx.xsd_parser_crate;
2143        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2144
2145        ctx.add_quick_xml_deserialize_usings([
2146            quote!(#xsd_parser::quick_xml::DeserializeReader),
2147            quote!(#xsd_parser::quick_xml::DeserializerOutput),
2148            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
2149            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
2150        ]);
2151
2152        // Handler for `DeserializerArtifact::Data`
2153        let data_handler = match (represents_element, self.occurs, self.max_occurs) {
2154            (_, Occurs::None, _) => unreachable!(),
2155            // Return instantly if we have received the expected value
2156            (false, Occurs::Single | Occurs::Optional, _) => quote! {
2157                *self.state = #deserializer_state_ident::Done__;
2158
2159                ElementHandlerOutput::Break {
2160                    event,
2161                    allow_any,
2162                }
2163            },
2164            // Finish the deserialization if the expected max value has been reached.
2165            // Continue if not.
2166            (false, Occurs::DynamicList | Occurs::StaticList(_), MaxOccurs::Bounded(max)) => {
2167                quote! {
2168                    if self.content.len() < #max {
2169                        *self.state = #deserializer_state_ident::Next__;
2170
2171                        ElementHandlerOutput::from_event(event, allow_any)
2172                    } else {
2173                        *self.state = #deserializer_state_ident::Done__;
2174
2175                        ElementHandlerOutput::Break {
2176                            event,
2177                            allow_any,
2178                        }
2179                    }
2180                }
2181            }
2182            // Value is unbound, continue in any case
2183            (_, _, _) => quote! {
2184                *self.state = #deserializer_state_ident::Next__;
2185
2186                ElementHandlerOutput::from_event(event, allow_any)
2187            },
2188        };
2189
2190        // Handler for `DeserializerArtifact::Deserializer`
2191        let deserializer_handler = match (self.occurs, self.max_occurs) {
2192            (Occurs::None, _) => unreachable!(),
2193            // If we only expect one element we never initialize a new deserializer
2194            // we only continue the deserialization process for `End` events (because
2195            // they may finish this deserializer).
2196            (Occurs::Single | Occurs::Optional, _) => quote! {
2197                *self.state = #deserializer_state_ident::Content__(deserializer);
2198
2199                ElementHandlerOutput::from_event_end(event, allow_any)
2200            },
2201            // If we expect multiple elements we only try to initialize a new
2202            // deserializer if the maximum has not been reached yet.
2203            // The `+1` is for the data that is contained in the yet unfinished
2204            // deserializer.
2205            (Occurs::DynamicList | Occurs::StaticList(_), MaxOccurs::Bounded(max)) => {
2206                quote! {
2207                    let can_have_more = self.content.len().saturating_add(1) < #max;
2208                    let ret = if can_have_more {
2209                        ElementHandlerOutput::from_event(event, allow_any)
2210                    } else {
2211                        ElementHandlerOutput::from_event_end(event, allow_any)
2212                    };
2213
2214                    match (can_have_more, &ret) {
2215                        (true, ElementHandlerOutput::Continue { .. })  => {
2216                            fallback.get_or_insert(#deserializer_state_ident::Content__(deserializer));
2217
2218                            *self.state = #deserializer_state_ident::Next__;
2219                        }
2220                        (false, _ ) | (_, ElementHandlerOutput::Break { .. }) => {
2221                            *self.state = #deserializer_state_ident::Content__(deserializer);
2222                        }
2223                    }
2224
2225                    ret
2226                }
2227            }
2228            // Unbound, we can try a new deserializer in any case.
2229            (Occurs::DynamicList | Occurs::StaticList(_), _) => quote! {
2230                let ret = ElementHandlerOutput::from_event(event, allow_any);
2231
2232                match &ret {
2233                    ElementHandlerOutput::Break { .. } => {
2234                        *self.state = #deserializer_state_ident::Content__(deserializer);
2235                    }
2236                    ElementHandlerOutput::Continue { .. } => {
2237                        fallback.get_or_insert(#deserializer_state_ident::Content__(deserializer));
2238
2239                        *self.state = #deserializer_state_ident::Next__;
2240                    }
2241                }
2242
2243                ret
2244            },
2245        };
2246
2247        quote! {
2248            fn handle_content<'de, R>(
2249                &mut self,
2250                reader: &R,
2251                output: DeserializerOutput<'de, #target_type>,
2252                fallback: &mut Option<#deserializer_state_ident>,
2253            ) -> Result<ElementHandlerOutput<'de>, Error>
2254            where
2255                R: DeserializeReader,
2256            {
2257                let DeserializerOutput {
2258                    artifact,
2259                    event,
2260                    allow_any,
2261                } = output;
2262
2263                if artifact.is_none() {
2264                    *self.state = fallback.take().unwrap_or(#deserializer_state_ident::Next__);
2265
2266                    return Ok(ElementHandlerOutput::break_(event, allow_any));
2267                }
2268
2269                if let Some(fallback) = fallback.take() {
2270                    self.finish_state(reader, fallback)?;
2271                }
2272
2273                Ok(match artifact {
2274                    DeserializerArtifact::None => unreachable!(),
2275                    DeserializerArtifact::Data(data) => {
2276                        self.store_content(data)?;
2277
2278                        #data_handler
2279                    }
2280                    DeserializerArtifact::Deserializer(deserializer) => {
2281                        #deserializer_handler
2282                    }
2283                })
2284            }
2285        }
2286    }
2287}
2288
2289impl ComplexDataAttribute<'_> {
2290    fn deserializer_matcher(
2291        &self,
2292        ctx: &Context<'_, '_>,
2293        index: &mut usize,
2294        any_attribute: &mut Option<TokenStream>,
2295    ) -> Option<TokenStream> {
2296        let b_name = &self.b_name;
2297        let field_ident = &self.ident;
2298
2299        let else_ = (*index).gt(&0).then(|| quote!(else));
2300
2301        if self.meta.is_any() {
2302            *any_attribute = Some(quote! {
2303                #field_ident.push(attrib)?;
2304            });
2305
2306            None
2307        } else if let Some(module) = self
2308            .meta
2309            .ident
2310            .ns
2311            .and_then(|ns| ctx.types.meta.types.modules.get(&ns))
2312        {
2313            let ns_name = ctx.resolve_type_for_deserialize_module(&module.make_ns_const());
2314
2315            *index += 1;
2316
2317            Some(quote! {
2318                #else_ if matches!(reader.resolve_local_name(attrib.key, &#ns_name), Some(#b_name)) {
2319                    reader.read_attrib(&mut #field_ident, #b_name, &attrib.value)?;
2320                }
2321            })
2322        } else {
2323            *index += 1;
2324
2325            Some(quote! {
2326                #else_ if attrib.key.local_name().as_ref() == #b_name {
2327                    reader.read_attrib(&mut #field_ident, #b_name, &attrib.value)?;
2328                }
2329            })
2330        }
2331    }
2332
2333    fn deserializer_var_decl(&self, ctx: &Context<'_, '_>) -> TokenStream {
2334        let field_ident = &self.ident;
2335        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2336
2337        if self.meta.is_any() {
2338            quote!(let mut #field_ident = #target_type::default();)
2339        } else {
2340            quote!(let mut #field_ident: Option<#target_type> = None;)
2341        }
2342    }
2343
2344    fn deserializer_struct_field_decl(&self, ctx: &Context<'_, '_>) -> TokenStream {
2345        let field_ident = &self.ident;
2346        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2347
2348        let target_type = if self.is_option {
2349            quote!(Option<#target_type>)
2350        } else {
2351            target_type
2352        };
2353
2354        quote! {
2355            #field_ident: #target_type,
2356        }
2357    }
2358
2359    fn deserializer_struct_field_init(
2360        &self,
2361        ctx: &Context<'_, '_>,
2362        type_ident: &Ident2,
2363    ) -> TokenStream {
2364        let field_ident = &self.ident;
2365        let xsd_parser = &ctx.xsd_parser_crate;
2366
2367        let convert = if self.meta.is_any() {
2368            None
2369        } else if self.default_value.is_some() {
2370            let default_fn_ident = format_ident!("default_{field_ident}");
2371
2372            Some(quote! { .unwrap_or_else(super::#type_ident::#default_fn_ident) })
2373        } else if self.meta.use_ == Use::Required {
2374            let name = &self.s_name;
2375
2376            ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
2377
2378            Some(
2379                quote! { .ok_or_else(|| reader.map_error(ErrorKind::MissingAttribute(#name.into())))? },
2380            )
2381        } else {
2382            None
2383        };
2384
2385        quote! {
2386            #field_ident: #field_ident #convert,
2387        }
2388    }
2389
2390    fn deserializer_struct_field_finish(&self) -> TokenStream {
2391        let field_ident = &self.ident;
2392
2393        quote! {
2394            #field_ident: self.#field_ident,
2395        }
2396    }
2397}
2398
2399impl ComplexDataElement<'_> {
2400    fn store_ident(&self) -> Ident2 {
2401        let ident = self.field_ident.to_string();
2402        let ident = ident.trim_start_matches('_');
2403
2404        format_ident!("store_{ident}")
2405    }
2406
2407    fn handler_ident(&self) -> Ident2 {
2408        let ident = self.field_ident.to_string();
2409        let ident = ident.trim_start_matches('_');
2410
2411        format_ident!("handle_{ident}")
2412    }
2413
2414    #[inline]
2415    fn treat_as_any(&self) -> bool {
2416        self.meta.is_any()
2417    }
2418
2419    #[inline]
2420    fn treat_as_group(&self) -> bool {
2421        !self.treat_as_any()
2422            && (self.meta.element_mode == ElementMode::Group || self.target_is_dynamic)
2423    }
2424
2425    #[inline]
2426    fn treat_as_element(&self) -> bool {
2427        !self.treat_as_group()
2428    }
2429
2430    fn target_type_allows_any(&self, types: &MetaTypes) -> bool {
2431        fn walk(types: &MetaTypes, visit: &mut HashSet<Ident>, ident: &Ident) -> bool {
2432            if !visit.insert(ident.clone()) {
2433                return false;
2434            }
2435
2436            match types.get_variant(ident) {
2437                Some(MetaTypeVariant::All(si) | MetaTypeVariant::Choice(si)) => {
2438                    for element in &*si.elements {
2439                        match &element.variant {
2440                            ElementMetaVariant::Any(_) => return true,
2441                            ElementMetaVariant::Type(type_) => {
2442                                if walk(types, visit, type_) {
2443                                    return true;
2444                                }
2445                            }
2446                        }
2447                    }
2448
2449                    false
2450                }
2451                Some(MetaTypeVariant::Sequence(si)) => match si.elements.first() {
2452                    None => false,
2453                    Some(ElementMeta {
2454                        variant: ElementMetaVariant::Any(_),
2455                        ..
2456                    }) => true,
2457                    Some(ElementMeta {
2458                        variant: ElementMetaVariant::Type(type_),
2459                        ..
2460                    }) => walk(types, visit, type_),
2461                },
2462                Some(MetaTypeVariant::ComplexType(ComplexMeta {
2463                    content: Some(content),
2464                    ..
2465                })) => walk(types, visit, content),
2466                _ => false,
2467            }
2468        }
2469
2470        let mut visit = HashSet::new();
2471
2472        match &self.meta.variant {
2473            ElementMetaVariant::Any(_) => true,
2474            ElementMetaVariant::Type(type_) => walk(types, &mut visit, type_),
2475        }
2476    }
2477
2478    fn deserializer_init_element(
2479        &self,
2480        ctx: &Context<'_, '_>,
2481        call_handler: &TokenStream,
2482    ) -> Option<TokenStream> {
2483        if !self.treat_as_element() {
2484            return None;
2485        }
2486
2487        let b_name = &self.b_name;
2488        let xsd_parser = &ctx.xsd_parser_crate;
2489        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2490
2491        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::WithDeserializer)]);
2492
2493        let body = quote! {
2494            let output = <#target_type as WithDeserializer>::Deserializer::init(reader, event)?;
2495
2496            return #call_handler;
2497        };
2498
2499        if let Some(module) = self
2500            .meta
2501            .ident
2502            .ns
2503            .and_then(|ns| ctx.types.meta.types.modules.get(&ns))
2504        {
2505            let ns_name = ctx.resolve_type_for_deserialize_module(&module.make_ns_const());
2506
2507            Some(quote! {
2508                if matches!(reader.resolve_local_name(x.name(), &#ns_name), Some(#b_name)) {
2509                    #body
2510                }
2511            })
2512        } else {
2513            Some(quote! {
2514                if x.name().local_name().as_ref() == #b_name {
2515                    #body
2516                }
2517            })
2518        }
2519    }
2520
2521    fn deserializer_init_group(
2522        &self,
2523        ctx: &Context<'_, '_>,
2524        handle_any: bool,
2525        call_handler: &TokenStream,
2526    ) -> Option<TokenStream> {
2527        if !self.treat_as_group() {
2528            return None;
2529        }
2530
2531        let xsd_parser = &ctx.xsd_parser_crate;
2532        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2533
2534        ctx.add_quick_xml_deserialize_usings([
2535            quote!(#xsd_parser::quick_xml::WithDeserializer),
2536            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
2537        ]);
2538
2539        let handle_continue = if handle_any {
2540            quote! {
2541                ElementHandlerOutput::Continue { event, allow_any } => {
2542                    allow_any_element = allow_any_element || allow_any;
2543
2544                    event
2545                },
2546            }
2547        } else {
2548            quote! {
2549                ElementHandlerOutput::Continue { event, .. } => event,
2550            }
2551        };
2552
2553        Some(quote! {
2554            let event = {
2555                let output = <#target_type as WithDeserializer>::Deserializer::init(reader, event)?;
2556
2557                match #call_handler? {
2558                    #handle_continue
2559                    output => { return Ok(output); }
2560                }
2561            };
2562        })
2563    }
2564
2565    fn deserializer_enum_variant_decl(&self, ctx: &Context<'_, '_>) -> TokenStream {
2566        let xsd_parser = &ctx.xsd_parser_crate;
2567
2568        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2569        let variant_ident = &self.variant_ident;
2570
2571        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::WithDeserializer)]);
2572
2573        match self.occurs {
2574            Occurs::Single | Occurs::Optional => quote! {
2575                #variant_ident(Option<#target_type>, Option<<#target_type as WithDeserializer>::Deserializer>),
2576            },
2577            Occurs::DynamicList | Occurs::StaticList(_) => quote! {
2578                #variant_ident(Vec<#target_type>, Option<<#target_type as WithDeserializer>::Deserializer>),
2579            },
2580            e => crate::unreachable!("{:?}", e),
2581        }
2582    }
2583
2584    fn deserializer_enum_variant_init_element(&self, ctx: &Context<'_, '_>) -> Option<TokenStream> {
2585        let handler_ident = self.handler_ident();
2586        let call_handler =
2587            quote!(self.#handler_ident(reader, Default::default(), output, &mut *fallback));
2588
2589        self.deserializer_init_element(ctx, &call_handler)
2590    }
2591
2592    fn deserializer_enum_variant_init_group(
2593        &self,
2594        ctx: &Context<'_, '_>,
2595        handle_any: bool,
2596    ) -> Option<TokenStream> {
2597        let handler_ident = self.handler_ident();
2598        let call_handler =
2599            quote!(self.#handler_ident(reader, Default::default(), output, &mut *fallback));
2600
2601        self.deserializer_init_group(ctx, handle_any, &call_handler)
2602    }
2603
2604    fn deserializer_enum_variant_init_any(&self, ctx: &Context<'_, '_>) -> Option<TokenStream> {
2605        if !self.treat_as_any() {
2606            return None;
2607        }
2608
2609        let xsd_parser = &ctx.xsd_parser_crate;
2610        let handler_ident = self.handler_ident();
2611        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2612
2613        ctx.add_quick_xml_deserialize_usings([
2614            quote!(#xsd_parser::quick_xml::WithDeserializer),
2615            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
2616        ]);
2617
2618        Some(quote! {
2619            let event = {
2620                let output = <#target_type as WithDeserializer>::Deserializer::init(reader, event)?;
2621
2622                match self.#handler_ident(reader, Default::default(), output, &mut *fallback)? {
2623                    ElementHandlerOutput::Continue { event, .. } => event,
2624                    output => { return Ok(output); }
2625                }
2626            };
2627        })
2628    }
2629
2630    fn deserializer_enum_variant_finish(
2631        &self,
2632        ctx: &Context<'_, '_>,
2633        type_ident: &Ident2,
2634        deserializer_ident: &Ident2,
2635    ) -> TokenStream {
2636        let name = &self.s_name;
2637        let xsd_parser = &ctx.xsd_parser_crate;
2638        let store_ident = self.store_ident();
2639        let variant_ident = &self.variant_ident;
2640
2641        let convert = match self.occurs {
2642            Occurs::None => crate::unreachable!(),
2643            Occurs::Single => {
2644                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
2645
2646                let mut ctx = quote! {
2647                    values.ok_or_else(|| ErrorKind::MissingElement(#name.into()))?
2648                };
2649
2650                if self.need_indirection {
2651                    ctx = quote! { Box::new(#ctx) };
2652                }
2653
2654                ctx
2655            }
2656            Occurs::Optional if self.need_indirection => {
2657                quote! { values.map(Box::new) }
2658            }
2659            Occurs::Optional | Occurs::DynamicList => {
2660                quote! { values }
2661            }
2662            Occurs::StaticList(sz) => {
2663                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
2664
2665                quote! {
2666                    values.try_into().map_err(|vec: Vec<_>| ErrorKind::InsufficientSize {
2667                        min: #sz,
2668                        max: #sz,
2669                        actual: vec.len(),
2670                    })?
2671                }
2672            }
2673        };
2674
2675        ctx.add_quick_xml_deserialize_usings([
2676            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
2677        ]);
2678
2679        quote! {
2680            S::#variant_ident(mut values, deserializer) => {
2681                if let Some(deserializer) = deserializer {
2682                    let value = deserializer.finish(reader)?;
2683                    #deserializer_ident::#store_ident(&mut values, value)?;
2684                }
2685
2686                Ok(super::#type_ident::#variant_ident(#convert))
2687            }
2688        }
2689    }
2690
2691    fn deserializer_enum_variant_fn_store(&self, ctx: &Context<'_, '_>) -> TokenStream {
2692        let xsd_parser = &ctx.xsd_parser_crate;
2693        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2694
2695        let name = &self.b_name;
2696        let store_ident = self.store_ident();
2697
2698        match self.occurs {
2699            Occurs::None => crate::unreachable!(),
2700            Occurs::Single | Occurs::Optional => {
2701                ctx.add_quick_xml_deserialize_usings([
2702                    quote!(#xsd_parser::quick_xml::Error),
2703                    quote!(#xsd_parser::quick_xml::ErrorKind),
2704                    quote!(#xsd_parser::quick_xml::RawByteStr),
2705                ]);
2706
2707                quote! {
2708                    fn #store_ident(values: &mut Option<#target_type>, value: #target_type) -> Result<(), Error> {
2709                        if values.is_some() {
2710                            Err(ErrorKind::DuplicateElement(RawByteStr::from_slice(#name)))?;
2711                        }
2712
2713                        *values = Some(value);
2714
2715                        Ok(())
2716                    }
2717                }
2718            }
2719            Occurs::DynamicList | Occurs::StaticList(_) => {
2720                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::Error)]);
2721
2722                quote! {
2723                    fn #store_ident(values: &mut Vec<#target_type>, value: #target_type) -> Result<(), Error> {
2724                        values.push(value);
2725
2726                        Ok(())
2727                    }
2728                }
2729            }
2730        }
2731    }
2732
2733    #[allow(clippy::too_many_lines)]
2734    fn deserializer_enum_variant_fn_handle(
2735        &self,
2736        ctx: &Context<'_, '_>,
2737        represents_element: bool,
2738        deserializer_ident: &Ident2,
2739        deserializer_state_ident: &Ident2,
2740    ) -> TokenStream {
2741        let xsd_parser = &ctx.xsd_parser_crate;
2742        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2743        let store_ident = self.store_ident();
2744        let handler_ident = self.handler_ident();
2745        let variant_ident = &self.variant_ident;
2746
2747        ctx.add_quick_xml_deserialize_usings([
2748            quote!(#xsd_parser::quick_xml::Error),
2749            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
2750            quote!(#xsd_parser::quick_xml::DeserializeReader),
2751            quote!(#xsd_parser::quick_xml::DeserializerOutput),
2752            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
2753        ]);
2754
2755        let values = match self.occurs {
2756            Occurs::None => crate::unreachable!(),
2757            Occurs::Single | Occurs::Optional => quote!(Option<#target_type>),
2758            Occurs::DynamicList | Occurs::StaticList(_) => quote!(Vec<#target_type>),
2759        };
2760
2761        // Handler for `DeserializerArtifact::Data`
2762        let data_handler = match (represents_element, self.occurs, self.meta.max_occurs) {
2763            (_, Occurs::None, _) => unreachable!(),
2764            // Return instantly if we have received the expected value
2765            (false, Occurs::Single | Occurs::Optional, _) => quote! {
2766                let data = #deserializer_ident::finish_state(reader, #deserializer_state_ident::#variant_ident(values, None))?;
2767                *self.state = #deserializer_state_ident::Done__(data);
2768
2769                ElementHandlerOutput::Break {
2770                    event,
2771                    allow_any,
2772                }
2773            },
2774            // Finish the deserialization if the expected max value has been reached.
2775            // Continue if not.
2776            (false, Occurs::DynamicList | Occurs::StaticList(_), MaxOccurs::Bounded(max)) => {
2777                quote! {
2778                    if values.len() < #max {
2779                        *self.state = #deserializer_state_ident::#variant_ident(values, None);
2780
2781                        ElementHandlerOutput::from_event(event, allow_any)
2782                    } else {
2783                        let data = #deserializer_ident::finish_state(#deserializer_state_ident::#variant_ident(values, None))?;
2784                        *self.state = #deserializer_state_ident::Done__(data);
2785
2786                        ElementHandlerOutput::Break {
2787                            event,
2788                            allow_any,
2789                        }
2790                    }
2791                }
2792            }
2793            // Value is unbound, continue in any case
2794            (_, _, _) => quote! {
2795                *self.state = #deserializer_state_ident::#variant_ident(values, None);
2796
2797                ElementHandlerOutput::from_event(event, allow_any)
2798            },
2799        };
2800
2801        // Handler for `DeserializerArtifact::Deserializer`
2802        let deserializer_handler = match (self.occurs, self.meta.max_occurs) {
2803            (Occurs::None, _) => unreachable!(),
2804            // If we only expect one element we never initialize a new deserializer
2805            // we only continue the deserialization process for `End` events (because
2806            // they may finish this deserializer).
2807            (Occurs::Single | Occurs::Optional, _) => quote! {
2808                *self.state = #deserializer_state_ident::#variant_ident(values, Some(deserializer));
2809
2810                ElementHandlerOutput::from_event_end(event, allow_any)
2811            },
2812            // If we expect multiple elements we only try to initialize a new
2813            // deserializer if the maximum has not been reached yet.
2814            // The `+1` is for the data that is contained in the yet unfinished
2815            // deserializer.
2816            (Occurs::DynamicList | Occurs::StaticList(_), MaxOccurs::Bounded(max)) => {
2817                quote! {
2818                                    let can_have_more = values.len().saturating_add(1) < #max;
2819                                    let ret = if can_have_more {
2820                                        ElementHandlerOutput::from_event(event, allow_any)
2821                                    } else {
2822                                        ElementHandlerOutput::from_event_end(event, allow_any)
2823                                    };
2824
2825                                    match (can_have_more, &ret) {
2826                                        (true, ElementHandlerOutput::Continue { .. })  => {
2827                                            fallback.get_or_insert(#deserializer_state_ident::#variant_ident(Default::default(), Some(deserializer)));
2828
2829                                            *self.state = #deserializer_state_ident::#variant_ident(values, None);
2830                                        }
2831                                        (false, _ ) | (_, ElementHandlerOutput::Break { .. }) => {
2832                                            *self.state = #deserializer_state_ident::#variant_ident(values, Some(deserializer));
2833                                        }
2834                                    }
2835                h
2836                                    ret
2837                                }
2838            }
2839            // Unbound, we can try a new deserializer in any case.
2840            (Occurs::DynamicList | Occurs::StaticList(_), _) => quote! {
2841                let ret = ElementHandlerOutput::from_event(event, allow_any);
2842
2843                match &ret {
2844                    ElementHandlerOutput::Break { .. } => {
2845                        *self.state = #deserializer_state_ident::#variant_ident(values, Some(deserializer));
2846                    }
2847                    ElementHandlerOutput::Continue { .. } => {
2848                        fallback.get_or_insert(#deserializer_state_ident::#variant_ident(Default::default(), Some(deserializer)));
2849
2850                        *self.state = #deserializer_state_ident::#variant_ident(values, None);
2851                    }
2852                }
2853
2854                ret
2855            },
2856        };
2857
2858        quote! {
2859            fn #handler_ident<'de, R>(
2860                &mut self,
2861                reader: &R,
2862                mut values: #values,
2863                output: DeserializerOutput<'de, #target_type>,
2864                fallback: &mut Option<#deserializer_state_ident>,
2865            ) -> Result<ElementHandlerOutput<'de>, Error>
2866            where
2867                R: DeserializeReader,
2868            {
2869                let DeserializerOutput {
2870                    artifact,
2871                    event,
2872                    allow_any,
2873                } = output;
2874
2875                if artifact.is_none() {
2876                    *self.state = match fallback.take() {
2877                        None => #deserializer_state_ident::Init__,
2878                        Some(#deserializer_state_ident::#variant_ident(_, Some(deserializer))) => #deserializer_state_ident::#variant_ident(values, Some(deserializer)),
2879                        _ => unreachable!(),
2880                    };
2881
2882                    return Ok(ElementHandlerOutput::break_(event, allow_any));
2883                }
2884
2885                match fallback.take() {
2886                    None => (),
2887                    Some(#deserializer_state_ident::#variant_ident(_, Some(deserializer))) => {
2888                        let data = deserializer.finish(reader)?;
2889                        #deserializer_ident::#store_ident(&mut values, data)?;
2890                    }
2891                    Some(_) => unreachable!(),
2892                }
2893
2894                Ok(match artifact {
2895                    DeserializerArtifact::None => unreachable!(),
2896                    DeserializerArtifact::Data(data) => {
2897                        #deserializer_ident::#store_ident(&mut values, data)?;
2898
2899                        #data_handler
2900                    }
2901                    DeserializerArtifact::Deserializer(deserializer) => {
2902                        #deserializer_handler
2903                    }
2904                })
2905            }
2906        }
2907    }
2908
2909    fn deserializer_enum_variant_fn_next_continue(&self, ctx: &Context<'_, '_>) -> TokenStream {
2910        let matcher = quote!(Some(deserializer));
2911        let output = quote!(deserializer.next(reader, event));
2912
2913        self.deserializer_enum_variant_fn_next(ctx, &matcher, &output)
2914    }
2915
2916    fn deserializer_enum_variant_fn_next_create(&self, ctx: &Context<'_, '_>) -> TokenStream {
2917        let xsd_parser = &ctx.xsd_parser_crate;
2918        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2919
2920        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::WithDeserializer)]);
2921
2922        let matcher = quote!(None);
2923        let output = quote!(<#target_type as WithDeserializer>::Deserializer::init(reader, event));
2924
2925        self.deserializer_enum_variant_fn_next(ctx, &matcher, &output)
2926    }
2927
2928    fn deserializer_enum_variant_fn_next(
2929        &self,
2930        ctx: &Context<'_, '_>,
2931        matcher: &TokenStream,
2932        output: &TokenStream,
2933    ) -> TokenStream {
2934        let xsd_parser = &ctx.xsd_parser_crate;
2935        let variant_ident = &self.variant_ident;
2936        let handler_ident = self.handler_ident();
2937
2938        ctx.add_quick_xml_deserialize_usings([
2939            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
2940        ]);
2941
2942        quote! {
2943            (S::#variant_ident(values, #matcher), event) => {
2944                let output = #output?;
2945
2946                match self.#handler_ident(reader, values, output, &mut fallback)? {
2947                    ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
2948                    ElementHandlerOutput::Continue { event, .. } => event,
2949                }
2950            },
2951        }
2952    }
2953
2954    fn deserializer_struct_field_decl(&self, ctx: &Context<'_, '_>) -> TokenStream {
2955        let field_ident = &self.field_ident;
2956        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
2957
2958        let target_type = match self.occurs {
2959            Occurs::Single | Occurs::Optional => quote!(Option<#target_type>),
2960            Occurs::DynamicList | Occurs::StaticList(_) => quote!(Vec<#target_type>),
2961            e => crate::unreachable!("{:?}", e),
2962        };
2963
2964        quote! {
2965            #field_ident: #target_type,
2966        }
2967    }
2968
2969    fn deserializer_struct_field_init(&self) -> TokenStream {
2970        let occurs = self.occurs;
2971        let field_ident = &self.field_ident;
2972
2973        match occurs {
2974            Occurs::None => quote!(),
2975            Occurs::Single | Occurs::Optional => quote!(#field_ident: None,),
2976            Occurs::DynamicList | Occurs::StaticList(_) => quote!(#field_ident: Vec::new(),),
2977        }
2978    }
2979
2980    fn deserializer_struct_field_init_element(&self, ctx: &Context<'_, '_>) -> Option<TokenStream> {
2981        let handler_ident = self.handler_ident();
2982        let call_handler = quote!(self.#handler_ident(reader, output, &mut *fallback));
2983
2984        self.deserializer_init_element(ctx, &call_handler)
2985    }
2986
2987    fn deserializer_struct_field_init_group(
2988        &self,
2989        ctx: &Context<'_, '_>,
2990        handle_any: bool,
2991    ) -> Option<TokenStream> {
2992        let handler_ident = self.handler_ident();
2993        let call_handler = quote!(self.#handler_ident(reader, output, &mut *fallback));
2994
2995        self.deserializer_init_group(ctx, handle_any, &call_handler)
2996    }
2997
2998    fn deserializer_struct_field_finish_state_all(&self) -> TokenStream {
2999        let store_ident = self.store_ident();
3000        let variant_ident = &self.variant_ident;
3001
3002        quote! {
3003            S::#variant_ident(deserializer) => self.#store_ident(deserializer.finish(reader)?)?,
3004        }
3005    }
3006
3007    fn deserializer_struct_field_finish_state_sequence(&self) -> TokenStream {
3008        let store_ident = self.store_ident();
3009        let variant_ident = &self.variant_ident;
3010
3011        quote! {
3012            S::#variant_ident(Some(deserializer)) => self.#store_ident(deserializer.finish(reader)?)?,
3013        }
3014    }
3015
3016    fn deserializer_struct_field_finish(&self, ctx: &Context<'_, '_>) -> TokenStream {
3017        let name = &self.s_name;
3018        let field_ident = &self.field_ident;
3019        let xsd_parser = &ctx.xsd_parser_crate;
3020
3021        let convert = match self.occurs {
3022            Occurs::None => crate::unreachable!(),
3023            Occurs::Single => {
3024                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
3025
3026                let mut ctx = quote! {
3027                    self.#field_ident.ok_or_else(|| ErrorKind::MissingElement(#name.into()))?
3028                };
3029
3030                if self.need_indirection {
3031                    ctx = quote! { Box::new(#ctx) };
3032                }
3033
3034                ctx
3035            }
3036            Occurs::Optional if self.need_indirection => {
3037                quote! { self.#field_ident.map(Box::new) }
3038            }
3039            Occurs::Optional | Occurs::DynamicList => {
3040                quote! { self.#field_ident }
3041            }
3042            Occurs::StaticList(sz) => {
3043                ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::ErrorKind)]);
3044
3045                quote! {
3046                    self.#field_ident.try_into().map_err(|vec: Vec<_>| ErrorKind::InsufficientSize {
3047                        min: #sz,
3048                        max: #sz,
3049                        actual: vec.len(),
3050                    })?
3051                }
3052            }
3053        };
3054
3055        quote! {
3056            #field_ident: #convert,
3057        }
3058    }
3059
3060    fn deserializer_struct_field_fn_store(&self, ctx: &Context<'_, '_>) -> TokenStream {
3061        let xsd_parser = &ctx.xsd_parser_crate;
3062        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
3063
3064        let name = &self.b_name;
3065        let field_ident = &self.field_ident;
3066        let store_ident = self.store_ident();
3067
3068        let body = match self.occurs {
3069            Occurs::None => crate::unreachable!(),
3070            Occurs::Single | Occurs::Optional => {
3071                ctx.add_quick_xml_deserialize_usings([
3072                    quote!(#xsd_parser::quick_xml::ErrorKind),
3073                    quote!(#xsd_parser::quick_xml::RawByteStr),
3074                ]);
3075
3076                quote! {
3077                    if self.#field_ident.is_some() {
3078                        Err(ErrorKind::DuplicateElement(RawByteStr::from_slice(#name)))?;
3079                    }
3080
3081                    self.#field_ident = Some(value);
3082                }
3083            }
3084            Occurs::DynamicList | Occurs::StaticList(_) => quote! {
3085                self.#field_ident.push(value);
3086            },
3087        };
3088
3089        ctx.add_quick_xml_deserialize_usings([quote!(#xsd_parser::quick_xml::Error)]);
3090
3091        quote! {
3092            fn #store_ident(&mut self, value: #target_type) -> Result<(), Error> {
3093                #body
3094
3095                Ok(())
3096            }
3097        }
3098    }
3099
3100    fn deserializer_struct_field_fn_handle_all(
3101        &self,
3102        ctx: &Context<'_, '_>,
3103        deserializer_state_ident: &Ident2,
3104    ) -> TokenStream {
3105        let xsd_parser = &ctx.xsd_parser_crate;
3106        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
3107        let store_ident = self.store_ident();
3108        let handler_ident = self.handler_ident();
3109        let variant_ident = &self.variant_ident;
3110
3111        ctx.add_quick_xml_deserialize_usings([
3112            quote!(#xsd_parser::quick_xml::Event),
3113            quote!(#xsd_parser::quick_xml::DeserializeReader),
3114            quote!(#xsd_parser::quick_xml::DeserializerOutput),
3115            quote!(#xsd_parser::quick_xml::DeserializerArtifact),
3116            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
3117        ]);
3118
3119        quote! {
3120            fn #handler_ident<'de, R>(
3121                &mut self,
3122                reader: &R,
3123                output: DeserializerOutput<'de, #target_type>,
3124                fallback: &mut Option<#deserializer_state_ident>,
3125            ) -> Result<ElementHandlerOutput<'de>, Error>
3126            where
3127                R: DeserializeReader,
3128            {
3129                let DeserializerOutput {
3130                    artifact,
3131                    event,
3132                    allow_any,
3133                } = output;
3134
3135                if artifact.is_none() {
3136                    let ret = ElementHandlerOutput::from_event(event, allow_any);
3137
3138                    *self.state = match ret {
3139                        ElementHandlerOutput::Continue { .. } => #deserializer_state_ident::Next__,
3140                        ElementHandlerOutput::Break { .. } => fallback.take().unwrap_or(#deserializer_state_ident::Next__),
3141                    };
3142
3143                    return Ok(ret);
3144                }
3145
3146                if let Some(fallback) = fallback.take() {
3147                    self.finish_state(reader, fallback)?;
3148                }
3149
3150                Ok(match artifact {
3151                    DeserializerArtifact::None => unreachable!(),
3152                    DeserializerArtifact::Data(data) => {
3153                        self.#store_ident(data)?;
3154
3155                        *self.state = #deserializer_state_ident::Next__;
3156
3157                        ElementHandlerOutput::from_event(event, allow_any)
3158                    }
3159                    DeserializerArtifact::Deserializer(deserializer) => {
3160                        let ret = ElementHandlerOutput::from_event(event, allow_any);
3161
3162                        match &ret {
3163                            ElementHandlerOutput::Continue { .. } => {
3164                                fallback.get_or_insert(#deserializer_state_ident::#variant_ident(deserializer));
3165
3166                                *self.state = #deserializer_state_ident::Next__;
3167                            }
3168                            ElementHandlerOutput::Break { .. } => {
3169                                *self.state = #deserializer_state_ident::#variant_ident(deserializer);
3170                            }
3171                        }
3172
3173                        ret
3174                    }
3175                })
3176            }
3177        }
3178    }
3179
3180    #[allow(clippy::too_many_lines)]
3181    fn deserializer_struct_field_fn_handle_sequence(
3182        &self,
3183        ctx: &Context<'_, '_>,
3184        next: Option<&ComplexDataElement<'_>>,
3185        deserializer_state_ident: &Ident2,
3186    ) -> TokenStream {
3187        let xsd_parser = &ctx.xsd_parser_crate;
3188        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
3189
3190        let store_ident = self.store_ident();
3191        let field_ident = &self.field_ident;
3192        let variant_ident = &self.variant_ident;
3193        let handler_ident = self.handler_ident();
3194
3195        ctx.add_quick_xml_deserialize_usings([
3196            quote!(#xsd_parser::quick_xml::Error),
3197            quote!(#xsd_parser::quick_xml::DeserializeReader),
3198            quote!(#xsd_parser::quick_xml::DeserializerOutput),
3199            quote!(#xsd_parser::quick_xml::ElementHandlerOutput),
3200        ]);
3201
3202        let next_state = if let Some(next) = next {
3203            let variant_ident = &next.variant_ident;
3204
3205            quote!(#deserializer_state_ident::#variant_ident(None))
3206        } else {
3207            quote!(#deserializer_state_ident::Done__)
3208        };
3209
3210        // Handler for `DeserializerArtifact::None`: Should only be the
3211        // case if we try to initialize a new deserializer.
3212        let handler_none = match (self.occurs, self.meta.min_occurs) {
3213            (Occurs::None, _) => unreachable!(),
3214            // If we do not expect any data we continue with the next state
3215            (_, 0) | (Occurs::Optional, _) => quote! {
3216                fallback.get_or_insert(#deserializer_state_ident::#variant_ident(None));
3217
3218                *self.state = #next_state;
3219
3220                return Ok(ElementHandlerOutput::from_event(event, allow_any));
3221            },
3222            // If we got the expected data, we move on, otherwise we stay in the
3223            // current state and break.
3224            (Occurs::Single, _) => quote! {
3225                if self.#field_ident.is_some() {
3226                    fallback.get_or_insert(#deserializer_state_ident::#variant_ident(None));
3227
3228                    *self.state = #next_state;
3229
3230                    return Ok(ElementHandlerOutput::from_event(event, allow_any));
3231                } else {
3232                    *self.state = #deserializer_state_ident::#variant_ident(None);
3233
3234                    return Ok(ElementHandlerOutput::break_(event, allow_any));
3235                }
3236            },
3237            // If we did not reach the expected amount of data, we stay in the
3238            // current state and break, otherwise we continue with the next state.
3239            (Occurs::DynamicList | Occurs::StaticList(_), min) => quote! {
3240                if self.#field_ident.len() < #min {
3241                    *self.state = #deserializer_state_ident::#variant_ident(None);
3242
3243                    return Ok(ElementHandlerOutput::break_(event, allow_any));
3244                } else {
3245                    fallback.get_or_insert(#deserializer_state_ident::#variant_ident(None));
3246
3247                    *self.state = #next_state;
3248
3249                    return Ok(ElementHandlerOutput::from_event(event, allow_any));
3250                }
3251            },
3252        };
3253
3254        // Handler for `DeserializerArtifact::Data`:
3255        let data_handler = match (self.occurs, self.meta.max_occurs) {
3256            // If we got some data we simple move one to the next element
3257            (Occurs::Single | Occurs::Optional, _) => quote! {
3258                *self.state = #next_state;
3259            },
3260            // If we got some data and the maximum amount of elements of this
3261            // type is reached we move on, otherwise we stay in the current state.
3262            (Occurs::DynamicList | Occurs::StaticList(_), MaxOccurs::Bounded(max)) => quote! {
3263                if self.#field_ident.len() < #max {
3264                    *self.state = #deserializer_state_ident::#variant_ident(None);
3265                } else {
3266                    *self.state = #next_state;
3267                }
3268            },
3269            // Unbounded amount. Stay in the current state in any case.
3270            (_, _) => quote! {
3271                *self.state = #deserializer_state_ident::#variant_ident(None);
3272            },
3273        };
3274
3275        // Handler for `DeserializerArtifact::Deserializer:
3276        let min = self.meta.min_occurs;
3277        let deserializer_handler = match self.occurs {
3278            // If we expect only one element we continue to the next state,
3279            // because the old yet unfinished deserializer already contains
3280            // this data.
3281            Occurs::Single | Occurs::Optional => quote! {
3282                *self.state = #next_state;
3283            },
3284            // If we have enough space for more data of the same element, we stay
3285            // inside the state, otherwise we continue with the next one.
3286            // The `+1` is for the data that is contained in the yet unfinished
3287            // deserializer.
3288            Occurs::DynamicList | Occurs::StaticList(_) if min > 0 => quote! {
3289                if self.#field_ident.len().saturating_add(1) < #min {
3290                    *self.state = #deserializer_state_ident::#variant_ident(None);
3291                } else {
3292                    *self.state = #next_state;
3293                }
3294            },
3295            // Infinit amount of data: Stay in the current state.
3296            _ => quote! {
3297                *self.state = #deserializer_state_ident::#variant_ident(None);
3298            },
3299        };
3300
3301        quote! {
3302            fn #handler_ident<'de, R>(
3303                &mut self,
3304                reader: &R,
3305                output: DeserializerOutput<'de, #target_type>,
3306                fallback: &mut Option<#deserializer_state_ident>,
3307            ) -> Result<ElementHandlerOutput<'de>, Error>
3308            where
3309                R: DeserializeReader,
3310            {
3311                let DeserializerOutput {
3312                    artifact,
3313                    event,
3314                    allow_any,
3315                } = output;
3316
3317                if artifact.is_none() {
3318                    #handler_none
3319                }
3320
3321                if let Some(fallback) = fallback.take() {
3322                    self.finish_state(reader, fallback)?;
3323                }
3324
3325                Ok(match artifact {
3326                    DeserializerArtifact::None => unreachable!(),
3327                    DeserializerArtifact::Data(data) => {
3328                        self.#store_ident(data)?;
3329
3330                        #data_handler
3331
3332                        ElementHandlerOutput::from_event(event, allow_any)
3333                    }
3334                    DeserializerArtifact::Deserializer(deserializer) => {
3335                        let ret = ElementHandlerOutput::from_event(event, allow_any);
3336
3337                        match &ret {
3338                            ElementHandlerOutput::Continue { .. } => {
3339                                fallback.get_or_insert(#deserializer_state_ident::#variant_ident(Some(deserializer)));
3340
3341                                #deserializer_handler
3342                            }
3343                            ElementHandlerOutput::Break { .. } => {
3344                                *self.state = #deserializer_state_ident::#variant_ident(Some(deserializer));
3345                            }
3346                        }
3347
3348                        ret
3349                    }
3350                })
3351            }
3352        }
3353    }
3354
3355    fn deserializer_struct_field_fn_next_all(&self, ctx: &Context<'_, '_>) -> TokenStream {
3356        let xad_parser = &ctx.xsd_parser_crate;
3357        let variant_ident = &self.variant_ident;
3358        let handler_ident = self.handler_ident();
3359
3360        ctx.add_quick_xml_deserialize_usings([
3361            quote!(#xad_parser::quick_xml::DeserializerOutput),
3362            quote!(#xad_parser::quick_xml::ElementHandlerOutput),
3363            quote!(#xad_parser::quick_xml::DeserializerArtifact),
3364        ]);
3365
3366        quote! {
3367            (
3368                S::#variant_ident(deserializer),
3369                event
3370            ) => {
3371                let output = deserializer.next(reader, event)?;
3372                match self.#handler_ident(reader, output, &mut fallback)? {
3373                    ElementHandlerOutput::Continue { event, .. } => event,
3374                    ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
3375                }
3376            }
3377        }
3378    }
3379
3380    fn deserializer_struct_field_fn_next_sequence_continue(
3381        &self,
3382        ctx: &Context<'_, '_>,
3383    ) -> TokenStream {
3384        let xad_parser = &ctx.xsd_parser_crate;
3385        let variant_ident = &self.variant_ident;
3386        let handler_ident = self.handler_ident();
3387
3388        ctx.add_quick_xml_deserialize_usings([
3389            quote!(#xad_parser::quick_xml::DeserializerOutput),
3390            quote!(#xad_parser::quick_xml::ElementHandlerOutput),
3391            quote!(#xad_parser::quick_xml::DeserializerArtifact),
3392        ]);
3393
3394        quote! {
3395            (
3396                S::#variant_ident(Some(deserializer)),
3397                event
3398            ) => {
3399                let output = deserializer.next(reader, event)?;
3400                match self.#handler_ident(reader, output, &mut fallback)? {
3401                    ElementHandlerOutput::Continue { event, allow_any } => {
3402                        allow_any_element = allow_any_element || allow_any;
3403
3404                        event
3405                    },
3406                    ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
3407                }
3408            }
3409        }
3410    }
3411
3412    #[allow(clippy::too_many_lines)]
3413    fn deserializer_struct_field_fn_next_sequence_create(
3414        &self,
3415        ctx: &Context<'_, '_>,
3416        next: Option<&ComplexDataElement<'_>>,
3417        allow_any: bool,
3418    ) -> TokenStream {
3419        let name = &self.b_name;
3420        let variant_ident = &self.variant_ident;
3421        let handler_ident = self.handler_ident();
3422        let target_type = ctx.resolve_type_for_deserialize_module(&self.target_type);
3423
3424        let next_state = if let Some(next) = next {
3425            let variant_ident = &next.variant_ident;
3426
3427            quote!(S::#variant_ident(None))
3428        } else {
3429            quote!(S::Done__)
3430        };
3431
3432        let allow_any = allow_any || self.target_type_allows_any(ctx.types.meta.types);
3433        let allow_any = allow_any.then(|| {
3434            quote! {
3435                allow_any_element = true;
3436                fallback.get_or_insert(S::#variant_ident(None));
3437            }
3438        });
3439
3440        let need_name_matcher =
3441            !self.target_is_dynamic && self.meta.element_mode == ElementMode::Element;
3442
3443        let mut body = quote! {
3444            let output = <#target_type as WithDeserializer>::Deserializer::init(reader, event)?;
3445            match self.#handler_ident(reader, output, &mut fallback)? {
3446                ElementHandlerOutput::Continue { event, allow_any } => {
3447                    allow_any_element = allow_any_element || allow_any;
3448
3449                    event
3450                },
3451                ElementHandlerOutput::Break { event, allow_any } => break (event, allow_any),
3452            }
3453        };
3454
3455        if self.meta.is_any() {
3456            body = quote! {
3457                if is_any_retry {
3458                    #body
3459                } else {
3460                    any_fallback.get_or_insert(S::#variant_ident(None));
3461
3462                    *self.state = #next_state;
3463
3464                    event
3465                }
3466            };
3467        } else if need_name_matcher {
3468            let ns_name = self
3469                .meta
3470                .ident
3471                .ns
3472                .as_ref()
3473                .and_then(|ns| ctx.types.meta.types.modules.get(ns))
3474                .map(|module| ctx.resolve_type_for_deserialize_module(&module.make_ns_const()))
3475                .map_or_else(|| quote!(None), |ns_name| quote!(Some(&#ns_name)));
3476
3477            body = quote! {
3478                if reader.check_start_tag_name(&event, #ns_name, #name) {
3479                    #body
3480                } else {
3481                    *self.state = #next_state;
3482
3483                    #allow_any
3484
3485                    event
3486                }
3487            }
3488        }
3489
3490        quote! {
3491            (
3492                S::#variant_ident(None),
3493                event @ (Event::Start(_) | Event::Empty(_))
3494            ) => {
3495                #body
3496            }
3497        }
3498    }
3499}
3500
3501fn do_box(is_boxed: bool, tokens: TokenStream) -> TokenStream {
3502    if is_boxed {
3503        quote!(Box::new(#tokens))
3504    } else {
3505        tokens
3506    }
3507}
3508
3509fn boxed_deserializer_ident(is_boxed: bool, deserializer_ident: &Ident2) -> Ident2 {
3510    if is_boxed {
3511        deserializer_ident.clone()
3512    } else {
3513        format_ident!("Self")
3514    }
3515}