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