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

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