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