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