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