1use std::collections::HashMap;
2
3use super::data::NestedValue;
4use super::{adapter::BurnModuleAdapter, error::Error};
5
6use serde::de::{EnumAccess, VariantAccess};
7use serde::{
8 de::{self, DeserializeSeed, IntoDeserializer, MapAccess, SeqAccess, Visitor},
9 forward_to_deserialize_any,
10};
11
12const RECORD_ITEM_SUFFIX: &str = "RecordItem";
13
14#[inline]
15fn custom_err<T: core::fmt::Display>(msg: T) -> Error {
16 <Error as de::Error>::custom(msg)
17}
18
19fn sequence_len(value: &NestedValue) -> Option<usize> {
21 match value {
22 NestedValue::Vec(v) => Some(v.len()),
23 NestedValue::U8s(v) => Some(v.len()),
24 NestedValue::U16s(v) => Some(v.len()),
25 NestedValue::F32s(v) => Some(v.len()),
26 _ => None,
27 }
28}
29
30pub struct Deserializer<A: BurnModuleAdapter> {
32 value: Option<NestedValue>,
35 default_for_missing_fields: bool,
36 phantom: std::marker::PhantomData<A>,
37}
38
39impl<A: BurnModuleAdapter> Deserializer<A> {
40 pub fn new(value: NestedValue, default_for_missing_fields: bool) -> Self {
47 Self {
48 value: Some(value),
49 default_for_missing_fields,
50 phantom: std::marker::PhantomData,
51 }
52 }
53
54 fn extract_scalar<T>(
55 self,
56 expected: &'static str,
57 extractor: impl FnOnce(&NestedValue) -> Option<T>,
58 ) -> Result<T, Error> {
59 let value = self
60 .value
61 .ok_or_else(|| custom_err(format!("expected {expected}, found nothing")))?;
62
63 match extractor(&value) {
64 Some(val) => Ok(val),
65 None => Err(custom_err(format!("expected {expected} but got {value:?}"))),
66 }
67 }
68}
69
70impl<'de, A: BurnModuleAdapter> serde::Deserializer<'de> for Deserializer<A> {
71 type Error = Error;
72
73 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
74 where
75 V: Visitor<'de>,
76 {
77 let default_for_missing_fields = self.default_for_missing_fields;
78 match self.value {
79 Some(NestedValue::Bool(v)) => visitor.visit_bool(v),
80 Some(NestedValue::String(v)) => visitor.visit_string(v),
81 Some(NestedValue::F32(v)) => visitor.visit_f32(v),
82 Some(NestedValue::F64(v)) => visitor.visit_f64(v),
83 Some(NestedValue::I16(v)) => visitor.visit_i16(v),
84 Some(NestedValue::I32(v)) => visitor.visit_i32(v),
85 Some(NestedValue::I64(v)) => visitor.visit_i64(v),
86 Some(NestedValue::U8(v)) => visitor.visit_u8(v),
87 Some(NestedValue::U16(v)) => visitor.visit_u16(v),
88 Some(NestedValue::U64(v)) => visitor.visit_u64(v),
89 Some(NestedValue::Map(map)) => {
90 visitor.visit_map(HashMapAccess::<A>::new(map, default_for_missing_fields))
91 }
92 Some(NestedValue::Vec(v)) => visitor.visit_seq(VecSeqAccess::<A, NestedValue>::new(
93 NestedValue::Vec(v),
94 default_for_missing_fields,
95 )?),
96 Some(NestedValue::U8s(v)) => visitor.visit_seq(VecSeqAccess::<A, u8>::new(
97 NestedValue::U8s(v),
98 default_for_missing_fields,
99 )?),
100 Some(NestedValue::U16s(v)) => visitor.visit_seq(VecSeqAccess::<A, u16>::new(
101 NestedValue::U16s(v),
102 default_for_missing_fields,
103 )?),
104 Some(NestedValue::F32s(v)) => visitor.visit_seq(VecSeqAccess::<A, f32>::new(
105 NestedValue::F32s(v),
106 default_for_missing_fields,
107 )?),
108 Some(NestedValue::Unsupported(type_name)) => Err(custom_err(format!(
109 "cannot deserialize unsupported source type: {type_name}"
110 ))),
111 Some(NestedValue::Default(_)) | None => Err(custom_err(
114 "cannot deserialize an untyped value: no concrete source value is available",
115 )),
116 }
117 }
118
119 fn deserialize_struct<V>(
120 self,
121 name: &'static str,
122 fields: &'static [&'static str],
123 visitor: V,
124 ) -> Result<V::Value, Self::Error>
125 where
126 V: Visitor<'de>,
127 {
128 let value = match self.value {
129 Some(value) => {
130 if let Some(name) = name.strip_suffix(RECORD_ITEM_SUFFIX) {
132 A::adapt(name, value)
133 } else {
134 value
135 }
136 }
137 None => {
138 return Err(custom_err(format!(
139 "Expected some value but got {:?}",
140 self.value
141 )));
142 }
143 };
144
145 match value {
146 NestedValue::Map(map) => {
147 let map = if self.default_for_missing_fields {
149 let mut map = map;
150 for field in fields.iter().map(|s| s.to_string()) {
151 map.entry(field.clone())
152 .or_insert(NestedValue::Default(Some(field)));
153 }
154 map
155 } else {
156 map
157 };
158
159 visitor.visit_map(HashMapAccess::<A>::new(
160 map,
161 self.default_for_missing_fields,
162 ))
163 }
164
165 _ => Err(custom_err(format!("Expected struct but got {value:?}"))),
166 }
167 }
168
169 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
170 where
171 V: Visitor<'de>,
172 {
173 match self.value {
174 Some(NestedValue::String(val)) => visitor.visit_string(val),
175 Some(other) => Err(custom_err(format!("expected string but got {other:?}"))),
176 None => Err(custom_err("expected string, found nothing")),
177 }
178 }
179
180 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
181 where
182 V: Visitor<'de>,
183 {
184 visitor.visit_unit()
185 }
186
187 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
188 where
189 V: Visitor<'de>,
190 {
191 match self.value {
192 Some(NestedValue::Map(map)) => visitor.visit_map(HashMapAccess::<A>::new(
193 map,
194 self.default_for_missing_fields,
195 )),
196
197 _ => Err(custom_err(format!(
198 "Expected map value but got {:?}",
199 self.value
200 ))),
201 }
202 }
203
204 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
205 where
206 V: Visitor<'de>,
207 {
208 let val = self.extract_scalar("bool", |v| v.clone().as_bool())?;
209 visitor.visit_bool(val)
210 }
211
212 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
213 where
214 V: Visitor<'de>,
215 {
216 let val = self.extract_scalar("i8", |v| {
217 v.clone().as_i16().and_then(|x| i8::try_from(x).ok())
218 })?;
219 visitor.visit_i8(val)
220 }
221
222 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
223 where
224 V: Visitor<'de>,
225 {
226 let val = self.extract_scalar("i16", |v| v.clone().as_i16())?;
227 visitor.visit_i16(val)
228 }
229
230 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
231 where
232 V: Visitor<'de>,
233 {
234 let val = self.extract_scalar("i32", |v| v.clone().as_i32())?;
235 visitor.visit_i32(val)
236 }
237
238 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
239 where
240 V: Visitor<'de>,
241 {
242 let val = self.extract_scalar("i64", |v| v.clone().as_i64())?;
243 visitor.visit_i64(val)
244 }
245
246 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
247 where
248 V: Visitor<'de>,
249 {
250 let val = self.extract_scalar("u8", |v| v.clone().as_u8())?;
251 visitor.visit_u8(val)
252 }
253
254 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
255 where
256 V: Visitor<'de>,
257 {
258 let val = self.extract_scalar("u16", |v| v.clone().as_u16())?;
259 visitor.visit_u16(val)
260 }
261
262 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
263 where
264 V: Visitor<'de>,
265 {
266 let val = self.extract_scalar("u32", |v| {
267 v.clone().as_u64().and_then(|x| u32::try_from(x).ok())
268 })?;
269 visitor.visit_u32(val)
270 }
271
272 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
273 where
274 V: Visitor<'de>,
275 {
276 let val = self.extract_scalar("u64", |v| v.clone().as_u64())?;
277 visitor.visit_u64(val)
278 }
279
280 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
281 where
282 V: Visitor<'de>,
283 {
284 let val = self.extract_scalar("f32", |v| v.clone().as_f32())?;
285 visitor.visit_f32(val)
286 }
287
288 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
289 where
290 V: Visitor<'de>,
291 {
292 let val = self.extract_scalar("f64", |v| v.clone().as_f64())?;
293 visitor.visit_f64(val)
294 }
295
296 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
297 where
298 V: Visitor<'de>,
299 {
300 match self.value {
301 Some(NestedValue::String(s)) if s.chars().count() == 1 => {
302 visitor.visit_char(s.chars().next().expect("count checked above"))
303 }
304 Some(other) => Err(custom_err(format!(
305 "expected a single-character string but got {other:?}"
306 ))),
307 None => Err(custom_err("expected char, found nothing")),
308 }
309 }
310
311 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
312 where
313 V: Visitor<'de>,
314 {
315 match self.value {
316 Some(NestedValue::String(val)) => visitor.visit_str(&val),
317 Some(other) => Err(custom_err(format!("expected str but got {other:?}"))),
318 None => Err(custom_err("expected str, found nothing")),
319 }
320 }
321
322 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value, Self::Error>
323 where
324 V: Visitor<'de>,
325 {
326 match self.value {
327 Some(NestedValue::U8s(bytes)) => visitor.visit_bytes(&bytes),
328 Some(other) => Err(custom_err(format!("expected bytes but got {other:?}"))),
329 None => Err(custom_err("expected bytes, found nothing")),
330 }
331 }
332
333 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value, Self::Error>
334 where
335 V: Visitor<'de>,
336 {
337 match self.value {
338 Some(NestedValue::U8s(bytes)) => visitor.visit_byte_buf(bytes),
339 Some(other) => Err(custom_err(format!(
340 "expected byte buffer but got {other:?}"
341 ))),
342 None => Err(custom_err("expected byte buffer, found nothing")),
343 }
344 }
345
346 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
347 where
348 V: Visitor<'de>,
349 {
350 if let Some(value) = self.value {
351 visitor.visit_some(Deserializer::<A>::new(
352 value,
353 self.default_for_missing_fields,
354 ))
355 } else {
356 visitor.visit_none()
357 }
358 }
359
360 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value, Self::Error>
361 where
362 V: Visitor<'de>,
363 {
364 match self.value {
367 None | Some(NestedValue::Default(_)) => visitor.visit_unit(),
368 Some(other) => Err(custom_err(format!("expected unit but got {other:?}"))),
369 }
370 }
371
372 fn deserialize_unit_struct<V>(
373 self,
374 _name: &'static str,
375 visitor: V,
376 ) -> Result<V::Value, Self::Error>
377 where
378 V: Visitor<'de>,
379 {
380 self.deserialize_unit(visitor)
381 }
382
383 fn deserialize_newtype_struct<V>(
384 self,
385 _name: &'static str,
386 visitor: V,
387 ) -> Result<V::Value, Self::Error>
388 where
389 V: Visitor<'de>,
390 {
391 let value = self
392 .value
393 .ok_or_else(|| custom_err("expected value for newtype struct but got None"))?;
394 visitor.visit_newtype_struct(Deserializer::<A>::new(
395 value,
396 self.default_for_missing_fields,
397 ))
398 }
399
400 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
401 where
402 V: Visitor<'de>,
403 {
404 if let Some(value) = self.value {
405 match value {
406 NestedValue::Vec(_) => visitor.visit_seq(VecSeqAccess::<A, NestedValue>::new(
407 value,
408 self.default_for_missing_fields,
409 )?),
410 NestedValue::U8s(_) => visitor.visit_seq(VecSeqAccess::<A, u8>::new(
411 value,
412 self.default_for_missing_fields,
413 )?),
414 NestedValue::U16s(_) => visitor.visit_seq(VecSeqAccess::<A, u16>::new(
415 value,
416 self.default_for_missing_fields,
417 )?),
418 NestedValue::F32s(_) => visitor.visit_seq(VecSeqAccess::<A, f32>::new(
419 value,
420 self.default_for_missing_fields,
421 )?),
422 _ => Err(custom_err(format!("Expected Vec but got {value:?}"))),
423 }
424 } else {
425 Err(custom_err("Expected Vec but got None"))
426 }
427 }
428
429 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
430 where
431 V: Visitor<'de>,
432 {
433 let actual = self.value.as_ref().and_then(sequence_len).ok_or_else(|| {
437 custom_err(format!(
438 "expected a sequence of length {len} but got {:?}",
439 self.value
440 ))
441 })?;
442 if actual != len {
443 return Err(<Error as de::Error>::invalid_length(
444 actual,
445 &format!("tuple of length {len}").as_str(),
446 ));
447 }
448 self.deserialize_seq(visitor)
449 }
450
451 fn deserialize_tuple_struct<V>(
452 self,
453 _name: &'static str,
454 len: usize,
455 visitor: V,
456 ) -> Result<V::Value, Self::Error>
457 where
458 V: Visitor<'de>,
459 {
460 let actual = self.value.as_ref().and_then(sequence_len).ok_or_else(|| {
461 custom_err(format!(
462 "expected a sequence of length {len} but got {:?}",
463 self.value
464 ))
465 })?;
466 if actual != len {
467 return Err(<Error as de::Error>::invalid_length(
468 actual,
469 &format!("tuple struct of length {len}").as_str(),
470 ));
471 }
472 self.deserialize_seq(visitor)
473 }
474
475 fn deserialize_enum<V>(
476 self,
477 _name: &'static str,
478 _variants: &'static [&'static str],
479 visitor: V,
480 ) -> Result<V::Value, Self::Error>
481 where
482 V: Visitor<'de>,
483 {
484 let value = self
485 .value
486 .ok_or_else(|| custom_err("expected value for enum but got None"))?;
487
488 let variant = match &value {
500 NestedValue::Map(map) => match map.get("DType") {
501 Some(NestedValue::String(name)) => name.clone(),
502 other => {
503 return Err(custom_err(format!(
504 "cannot resolve the enum variant: expected a 'DType' string tag, got {other:?}"
505 )));
506 }
507 },
508 other => {
509 return Err(custom_err(format!(
510 "cannot resolve the enum variant: expected a map with a 'DType' tag, got {other:?}"
511 )));
512 }
513 };
514
515 visitor.visit_enum(ProbeEnumAccess::<A>::new(
516 value,
517 variant,
518 self.default_for_missing_fields,
519 ))
520 }
521
522 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value, Self::Error>
523 where
524 V: Visitor<'de>,
525 {
526 match self.value {
527 Some(NestedValue::String(val)) => visitor.visit_str(&val),
528 Some(other) => Err(custom_err(format!(
529 "expected identifier string but got {other:?}"
530 ))),
531 None => Err(custom_err("expected identifier, found nothing")),
532 }
533 }
534}
535
536struct VecSeqAccess<A: BurnModuleAdapter, I> {
538 iter: Box<dyn Iterator<Item = I>>,
539 default_for_missing_fields: bool,
540 phantom: std::marker::PhantomData<A>,
541}
542
543impl<A: BurnModuleAdapter> VecSeqAccess<A, NestedValue> {
544 fn new(vec: NestedValue, default_for_missing_fields: bool) -> Result<Self, Error> {
545 match vec {
546 NestedValue::Vec(v) => Ok(VecSeqAccess {
547 iter: Box::new(v.into_iter()),
548 default_for_missing_fields,
549 phantom: std::marker::PhantomData,
550 }),
551 other => Err(custom_err(format!("expected Vec, found {other:?}"))),
552 }
553 }
554}
555
556impl<A: BurnModuleAdapter> VecSeqAccess<A, u8> {
557 fn new(vec: NestedValue, default_for_missing_fields: bool) -> Result<Self, Error> {
558 match vec {
559 NestedValue::U8s(v) => Ok(VecSeqAccess {
560 iter: Box::new(v.into_iter()),
561 default_for_missing_fields,
562 phantom: std::marker::PhantomData,
563 }),
564 other => Err(custom_err(format!("expected U8s, found {other:?}"))),
565 }
566 }
567}
568
569impl<A: BurnModuleAdapter> VecSeqAccess<A, u16> {
570 fn new(vec: NestedValue, default_for_missing_fields: bool) -> Result<Self, Error> {
571 match vec {
572 NestedValue::U16s(v) => Ok(VecSeqAccess {
573 iter: Box::new(v.into_iter()),
574 default_for_missing_fields,
575 phantom: std::marker::PhantomData,
576 }),
577 other => Err(custom_err(format!("expected U16s, found {other:?}"))),
578 }
579 }
580}
581
582impl<A: BurnModuleAdapter> VecSeqAccess<A, f32> {
583 fn new(vec: NestedValue, default_for_missing_fields: bool) -> Result<Self, Error> {
584 match vec {
585 NestedValue::F32s(v) => Ok(VecSeqAccess {
586 iter: Box::new(v.into_iter()),
587 default_for_missing_fields,
588 phantom: std::marker::PhantomData,
589 }),
590 other => Err(custom_err(format!("expected F32s, found {other:?}"))),
591 }
592 }
593}
594
595impl<'de, A> SeqAccess<'de> for VecSeqAccess<A, NestedValue>
596where
597 NestedValueWrapper<A>: IntoDeserializer<'de, Error>,
598 A: BurnModuleAdapter,
599{
600 type Error = Error;
601
602 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
603 where
604 T: DeserializeSeed<'de>,
605 {
606 let item = match self.iter.next() {
607 Some(v) => v,
608 None => return Ok(None),
609 };
610
611 seed.deserialize(
612 NestedValueWrapper::<A>::new(item, self.default_for_missing_fields).into_deserializer(),
613 )
614 .map(Some)
615 }
616}
617
618impl<'de, A> SeqAccess<'de> for VecSeqAccess<A, u8>
619where
620 NestedValueWrapper<A>: IntoDeserializer<'de, Error>,
621 A: BurnModuleAdapter,
622{
623 type Error = Error;
624
625 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
626 where
627 T: DeserializeSeed<'de>,
628 {
629 let item = match self.iter.next() {
630 Some(v) => v,
631 None => return Ok(None),
632 };
633
634 seed.deserialize(
635 NestedValueWrapper::<A>::new(NestedValue::U8(item), self.default_for_missing_fields)
636 .into_deserializer(),
637 )
638 .map(Some)
639 }
640}
641
642impl<'de, A> SeqAccess<'de> for VecSeqAccess<A, u16>
643where
644 NestedValueWrapper<A>: IntoDeserializer<'de, Error>,
645 A: BurnModuleAdapter,
646{
647 type Error = Error;
648
649 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
650 where
651 T: DeserializeSeed<'de>,
652 {
653 let item = match self.iter.next() {
654 Some(v) => v,
655 None => return Ok(None),
656 };
657
658 seed.deserialize(
659 NestedValueWrapper::<A>::new(NestedValue::U16(item), self.default_for_missing_fields)
660 .into_deserializer(),
661 )
662 .map(Some)
663 }
664}
665
666impl<'de, A> SeqAccess<'de> for VecSeqAccess<A, f32>
667where
668 NestedValueWrapper<A>: IntoDeserializer<'de, Error>,
669 A: BurnModuleAdapter,
670{
671 type Error = Error;
672
673 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
674 where
675 T: DeserializeSeed<'de>,
676 {
677 let item = match self.iter.next() {
678 Some(v) => v,
679 None => return Ok(None),
680 };
681
682 seed.deserialize(
683 NestedValueWrapper::<A>::new(NestedValue::F32(item), self.default_for_missing_fields)
684 .into_deserializer(),
685 )
686 .map(Some)
687 }
688}
689
690struct HashMapAccess<A: BurnModuleAdapter> {
692 iter: std::collections::hash_map::IntoIter<String, NestedValue>,
693 next_value: Option<NestedValue>,
694 default_for_missing_fields: bool,
695 phantom: std::marker::PhantomData<A>,
696}
697
698impl<A: BurnModuleAdapter> HashMapAccess<A> {
699 fn new(map: HashMap<String, NestedValue>, default_for_missing_fields: bool) -> Self {
700 HashMapAccess {
701 iter: map.into_iter(),
702 next_value: None,
703 default_for_missing_fields,
704 phantom: std::marker::PhantomData,
705 }
706 }
707}
708
709impl<'de, A> MapAccess<'de> for HashMapAccess<A>
710where
711 String: IntoDeserializer<'de, Error>,
712 NestedValueWrapper<A>: IntoDeserializer<'de, Error>,
713 A: BurnModuleAdapter,
714{
715 type Error = Error;
716
717 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
718 where
719 T: DeserializeSeed<'de>,
720 {
721 match self.iter.next() {
722 Some((k, v)) => {
723 self.next_value = Some(v);
724 seed.deserialize(k.into_deserializer()).map(Some)
725 }
726 None => Ok(None),
727 }
728 }
729
730 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, Self::Error>
731 where
732 T: DeserializeSeed<'de>,
733 {
734 match self.next_value.take() {
735 Some(NestedValue::Default(originator)) => {
736 seed.deserialize(DefaultDeserializer::new(originator))
737 }
738 Some(v) => seed.deserialize(
739 NestedValueWrapper::new(v, self.default_for_missing_fields).into_deserializer(),
740 ),
741 None => seed.deserialize(DefaultDeserializer::new(None)),
742 }
743 }
744}
745
746struct ProbeEnumAccess<A: BurnModuleAdapter> {
747 value: NestedValue,
748 current_variant: String,
749 default_for_missing_fields: bool,
750 phantom: std::marker::PhantomData<A>,
751}
752
753impl<A: BurnModuleAdapter> ProbeEnumAccess<A> {
754 fn new(value: NestedValue, current_variant: String, default_for_missing_fields: bool) -> Self {
755 ProbeEnumAccess {
756 value,
757 current_variant,
758 default_for_missing_fields,
759 phantom: std::marker::PhantomData,
760 }
761 }
762}
763
764impl<'de, A> EnumAccess<'de> for ProbeEnumAccess<A>
765where
766 A: BurnModuleAdapter,
767{
768 type Error = Error;
769 type Variant = Self;
770
771 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error>
772 where
773 V: DeserializeSeed<'de>,
774 {
775 seed.deserialize(self.current_variant.clone().into_deserializer())
776 .map(|v| (v, self))
777 }
778}
779
780impl<'de, A> VariantAccess<'de> for ProbeEnumAccess<A>
781where
782 A: BurnModuleAdapter,
783{
784 type Error = Error;
785
786 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error>
787 where
788 T: DeserializeSeed<'de>,
789 {
790 let value = seed.deserialize(
791 NestedValueWrapper::<A>::new(self.value, self.default_for_missing_fields)
792 .into_deserializer(),
793 )?;
794 Ok(value)
795 }
796
797 fn unit_variant(self) -> Result<(), Self::Error> {
798 match self.value {
799 NestedValue::Map(value) => match value.get("DType") {
800 Some(NestedValue::String(variant)) => {
801 if *variant == self.current_variant {
802 Ok(())
803 } else {
804 Err(Error::Other("Wrong variant".to_string()))
805 }
806 }
807 Some(other) => Err(custom_err(format!(
808 "expected DType variant as string, got {other:?}"
809 ))),
810 None => Err(custom_err("expected map containing 'DType' key for enum")),
811 },
812 other => Err(custom_err(format!(
813 "expected map for enum variant, got {other:?}"
814 ))),
815 }
816 }
817
818 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value, Self::Error>
819 where
820 V: Visitor<'de>,
821 {
822 let default_for_missing_fields = self.default_for_missing_fields;
823 match self.value {
824 NestedValue::Vec(v) => visitor.visit_seq(VecSeqAccess::<A, NestedValue>::new(
825 NestedValue::Vec(v),
826 default_for_missing_fields,
827 )?),
828 NestedValue::U8s(v) => visitor.visit_seq(VecSeqAccess::<A, u8>::new(
829 NestedValue::U8s(v),
830 default_for_missing_fields,
831 )?),
832 NestedValue::U16s(v) => visitor.visit_seq(VecSeqAccess::<A, u16>::new(
833 NestedValue::U16s(v),
834 default_for_missing_fields,
835 )?),
836 NestedValue::F32s(v) => visitor.visit_seq(VecSeqAccess::<A, f32>::new(
837 NestedValue::F32s(v),
838 default_for_missing_fields,
839 )?),
840 other => Err(custom_err(format!(
841 "expected a sequence for a tuple enum variant but got {other:?}"
842 ))),
843 }
844 }
845
846 fn struct_variant<V>(
847 self,
848 _fields: &'static [&'static str],
849 visitor: V,
850 ) -> Result<V::Value, Self::Error>
851 where
852 V: Visitor<'de>,
853 {
854 match self.value {
855 NestedValue::Map(map) => visitor.visit_map(HashMapAccess::<A>::new(
856 map,
857 self.default_for_missing_fields,
858 )),
859 other => Err(custom_err(format!(
860 "expected a map for a struct enum variant but got {other:?}"
861 ))),
862 }
863 }
864}
865
866struct NestedValueWrapper<A: BurnModuleAdapter> {
868 value: NestedValue,
869 default_for_missing_fields: bool,
870 phantom: std::marker::PhantomData<A>,
871}
872
873impl<A: BurnModuleAdapter> NestedValueWrapper<A> {
874 fn new(value: NestedValue, default_for_missing_fields: bool) -> Self {
875 Self {
876 value,
877 default_for_missing_fields,
878 phantom: std::marker::PhantomData,
879 }
880 }
881}
882
883impl<A: BurnModuleAdapter> IntoDeserializer<'_, Error> for NestedValueWrapper<A> {
884 type Deserializer = Deserializer<A>;
885
886 fn into_deserializer(self) -> Self::Deserializer {
887 Deserializer::<A>::new(self.value, self.default_for_missing_fields)
888 }
889}
890
891struct DefaultDeserializer {
893 originator_field_name: Option<String>,
894}
895
896impl DefaultDeserializer {
897 fn new(originator_field_name: Option<String>) -> Self {
898 Self {
899 originator_field_name,
900 }
901 }
902}
903
904impl<'de> serde::Deserializer<'de> for DefaultDeserializer {
905 type Error = Error;
906
907 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value, Self::Error>
908 where
909 V: Visitor<'de>,
910 {
911 Err(Error::Other(format!(
914 "Missing source values for the '{}' field of type '<unknown>'. Please verify the source data and ensure the field name is correct",
915 self.originator_field_name.unwrap_or("UNKNOWN".to_string()),
916 )))
917 }
918
919 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
920 where
921 V: Visitor<'de>,
922 {
923 visitor.visit_i32(Default::default())
924 }
925
926 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
927 where
928 V: Visitor<'de>,
929 {
930 visitor.visit_f32(Default::default())
931 }
932
933 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
934 where
935 V: Visitor<'de>,
936 {
937 visitor.visit_i16(Default::default())
938 }
939
940 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
941 where
942 V: Visitor<'de>,
943 {
944 visitor.visit_i64(Default::default())
945 }
946
947 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
948 where
949 V: Visitor<'de>,
950 {
951 visitor.visit_u16(Default::default())
952 }
953
954 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
955 where
956 V: Visitor<'de>,
957 {
958 visitor.visit_u64(Default::default())
959 }
960
961 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value, Self::Error>
962 where
963 V: Visitor<'de>,
964 {
965 visitor.visit_f64(Default::default())
966 }
967
968 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value, Self::Error>
969 where
970 V: Visitor<'de>,
971 {
972 visitor.visit_bool(Default::default())
973 }
974
975 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value, Self::Error>
976 where
977 V: Visitor<'de>,
978 {
979 visitor.visit_char(Default::default())
980 }
981
982 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value, Self::Error>
983 where
984 V: Visitor<'de>,
985 {
986 visitor.visit_str(Default::default())
987 }
988
989 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
990 where
991 V: Visitor<'de>,
992 {
993 visitor.visit_i8(Default::default())
994 }
995
996 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value, Self::Error>
997 where
998 V: Visitor<'de>,
999 {
1000 visitor.visit_u8(Default::default())
1001 }
1002
1003 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1004 where
1005 V: Visitor<'de>,
1006 {
1007 visitor.visit_u32(Default::default())
1008 }
1009
1010 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1011 where
1012 V: Visitor<'de>,
1013 {
1014 visitor.visit_none()
1015 }
1016
1017 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1018 where
1019 V: Visitor<'de>,
1020 {
1021 visitor.visit_seq(DefaultSeqAccess::new(None))
1022 }
1023
1024 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1025 where
1026 V: Visitor<'de>,
1027 {
1028 visitor.visit_string(Default::default())
1029 }
1030
1031 fn deserialize_struct<V>(
1032 self,
1033 name: &'static str,
1034 _fields: &'static [&'static str],
1035 _visitor: V,
1036 ) -> Result<V::Value, Self::Error>
1037 where
1038 V: Visitor<'de>,
1039 {
1040 Err(Error::Other(format!(
1041 "Missing source values for the '{}' field of type '{}'. Please verify the source data and ensure the field name is correct",
1042 self.originator_field_name.unwrap_or("UNKNOWN".to_string()),
1043 name,
1044 )))
1045 }
1046
1047 fn deserialize_tuple_struct<V>(
1048 self,
1049 _name: &'static str,
1050 len: usize,
1051 visitor: V,
1052 ) -> Result<V::Value, Self::Error>
1053 where
1054 V: Visitor<'de>,
1055 {
1056 visitor.visit_seq(DefaultSeqAccess::new(Some(len)))
1057 }
1058
1059 fn deserialize_tuple<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error>
1060 where
1061 V: Visitor<'de>,
1062 {
1063 visitor.visit_seq(DefaultSeqAccess::new(Some(len)))
1064 }
1065
1066 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1067 where
1068 V: Visitor<'de>,
1069 {
1070 visitor.visit_map(DefaultMapAccess::new())
1071 }
1072
1073 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1074 where
1075 V: Visitor<'de>,
1076 {
1077 visitor.visit_unit()
1078 }
1079
1080 forward_to_deserialize_any! {
1081 u128 bytes byte_buf unit unit_struct newtype_struct
1082 enum identifier
1083 }
1084}
1085
1086pub struct DefaultSeqAccess {
1088 size: Option<usize>,
1089}
1090
1091impl Default for DefaultSeqAccess {
1092 fn default() -> Self {
1093 Self::new(None)
1094 }
1095}
1096
1097impl DefaultSeqAccess {
1098 pub fn new(size: Option<usize>) -> Self {
1100 DefaultSeqAccess { size }
1101 }
1102}
1103
1104impl<'de> SeqAccess<'de> for DefaultSeqAccess {
1105 type Error = Error;
1106
1107 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, Self::Error>
1108 where
1109 T: DeserializeSeed<'de>,
1110 {
1111 match self.size {
1112 Some(0) => Ok(None),
1113 Some(ref mut size) => {
1114 *size -= 1;
1115 seed.deserialize(DefaultDeserializer::new(None)).map(Some)
1116 }
1117 None => Ok(None),
1118 }
1119 }
1120
1121 fn size_hint(&self) -> Option<usize> {
1122 self.size
1123 }
1124}
1125
1126pub struct DefaultMapAccess;
1128
1129impl Default for DefaultMapAccess {
1130 fn default() -> Self {
1131 Self::new()
1132 }
1133}
1134
1135impl DefaultMapAccess {
1136 pub fn new() -> Self {
1138 DefaultMapAccess
1139 }
1140}
1141
1142impl<'de> MapAccess<'de> for DefaultMapAccess {
1143 type Error = Error;
1144
1145 fn next_key_seed<T>(&mut self, _seed: T) -> Result<Option<T::Value>, Self::Error>
1146 where
1147 T: DeserializeSeed<'de>,
1148 {
1149 Ok(None)
1150 }
1151
1152 fn next_value_seed<T>(&mut self, _seed: T) -> Result<T::Value, Self::Error>
1153 where
1154 T: DeserializeSeed<'de>,
1155 {
1156 Err(custom_err(
1159 "no value is available from the default (empty) map access",
1160 ))
1161 }
1162
1163 fn size_hint(&self) -> Option<usize> {
1164 None
1165 }
1166}
1167
1168#[cfg(test)]
1169mod tests {
1170 use super::*;
1171 use crate::nested::adapter::DefaultAdapter;
1172 use serde::Deserialize;
1173
1174 #[derive(Debug, Deserialize, PartialEq)]
1175 struct AllScalars {
1176 b: bool,
1177 i16_val: i16,
1178 i32_val: i32,
1179 i64_val: i64,
1180 u8_val: u8,
1181 u16_val: u16,
1182 u64_val: u64,
1183 f32_val: f32,
1184 f64_val: f64,
1185 s: String,
1186 }
1187
1188 #[derive(Debug, Deserialize, PartialEq)]
1189 struct Config {
1190 hidden_size: i32,
1191 }
1192
1193 #[derive(Debug, Deserialize, PartialEq)]
1194 struct Newtype(i32);
1195
1196 #[derive(Debug, Deserialize, PartialEq)]
1197 enum MockDType {
1198 Float32,
1199 Int32,
1200 }
1201
1202 #[test]
1203 fn should_deserialize_all_scalars_correctly() {
1204 let mut map = HashMap::new();
1205 map.insert("b".to_string(), NestedValue::Bool(true));
1206 map.insert("i16_val".to_string(), NestedValue::I16(16));
1207 map.insert("i32_val".to_string(), NestedValue::I32(32));
1208 map.insert("i64_val".to_string(), NestedValue::I64(64));
1209 map.insert("u8_val".to_string(), NestedValue::U8(8));
1210 map.insert("u16_val".to_string(), NestedValue::U16(16));
1211 map.insert("u64_val".to_string(), NestedValue::U64(64));
1212 map.insert("f32_val".to_string(), NestedValue::F32(1.25));
1213 map.insert("f64_val".to_string(), NestedValue::F64(2.5));
1214 map.insert("s".to_string(), NestedValue::String("burn".to_string()));
1215
1216 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1217 let config = AllScalars::deserialize(de).unwrap();
1218
1219 assert_eq!(
1220 config,
1221 AllScalars {
1222 b: true,
1223 i16_val: 16,
1224 i32_val: 32,
1225 i64_val: 64,
1226 u8_val: 8,
1227 u16_val: 16,
1228 u64_val: 64,
1229 f32_val: 1.25,
1230 f64_val: 2.5,
1231 s: "burn".to_string(),
1232 }
1233 );
1234 }
1235
1236 #[test]
1237 fn should_deserialize_i64_as_i32_when_in_range() {
1238 let mut map = HashMap::new();
1239 map.insert("hidden_size".to_string(), NestedValue::I64(768));
1240
1241 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1242 let config = Config::deserialize(de).unwrap();
1243
1244 assert_eq!(config, Config { hidden_size: 768 });
1245 }
1246
1247 #[test]
1248 fn should_return_err_on_type_mismatch() {
1249 let mut map = HashMap::new();
1250 map.insert(
1251 "hidden_size".to_string(),
1252 NestedValue::String("768".to_string()),
1253 );
1254
1255 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1256 let result = Config::deserialize(de);
1257
1258 assert!(result.is_err());
1259 }
1260
1261 #[test]
1262 fn should_return_err_on_missing_field() {
1263 let map = HashMap::new();
1264 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1265 let result = Config::deserialize(de);
1266
1267 assert!(result.is_err());
1268 }
1269
1270 #[test]
1271 fn should_deserialize_newtype_struct() {
1272 let de = Deserializer::<DefaultAdapter>::new(NestedValue::I32(42), false);
1273 let result = Newtype::deserialize(de).unwrap();
1274 assert_eq!(result, Newtype(42));
1275 }
1276
1277 #[test]
1278 fn should_return_err_on_invalid_seq() {
1279 #[derive(Debug, Deserialize)]
1280 #[allow(dead_code)]
1281 struct SeqHolder(Vec<i32>);
1282
1283 let de = Deserializer::<DefaultAdapter>::new(NestedValue::I32(42), false);
1284 let result = SeqHolder::deserialize(de);
1285 assert!(result.is_err());
1286 }
1287
1288 #[test]
1289 fn should_deserialize_dtype_enum() {
1290 let mut map = HashMap::new();
1291 map.insert(
1292 "DType".to_string(),
1293 NestedValue::String("Float32".to_string()),
1294 );
1295 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1296 let result = MockDType::deserialize(de).unwrap();
1297 assert_eq!(result, MockDType::Float32);
1298 }
1299
1300 #[test]
1301 fn should_return_err_on_missing_dtype_key() {
1302 let mut map = HashMap::new();
1303 map.insert(
1304 "OtherKey".to_string(),
1305 NestedValue::String("Float32".to_string()),
1306 );
1307 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1308 let result = MockDType::deserialize(de);
1309 assert!(result.is_err());
1310 }
1311
1312 #[test]
1313 fn should_return_err_on_invalid_enum_shape() {
1314 let de = Deserializer::<DefaultAdapter>::new(NestedValue::I32(42), false);
1315 let result = MockDType::deserialize(de);
1316 assert!(result.is_err());
1317 }
1318
1319 #[test]
1320 fn should_return_err_on_invalid_dtype_variant_type() {
1321 let mut map = HashMap::new();
1322 map.insert("DType".to_string(), NestedValue::I32(42));
1323 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1324 let result = MockDType::deserialize(de);
1325 assert!(result.is_err());
1326 }
1327
1328 #[test]
1329 fn should_skip_a_field_the_target_does_not_name() {
1330 for extra in [
1331 NestedValue::Default(None),
1332 NestedValue::Unsupported("torch.device".to_string()),
1333 ] {
1334 let mut map = HashMap::new();
1335 map.insert("hidden_size".to_string(), NestedValue::I32(1));
1336 map.insert("extra".to_string(), extra);
1337
1338 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1339 assert_eq!(Config::deserialize(de).unwrap(), Config { hidden_size: 1 });
1340 }
1341 }
1342
1343 #[test]
1344 fn should_return_err_on_unsupported_value() {
1345 let mut map = HashMap::new();
1346 map.insert(
1347 "hidden_size".to_string(),
1348 NestedValue::Unsupported("numpy.int64".to_string()),
1349 );
1350 let de = Deserializer::<DefaultAdapter>::new(NestedValue::Map(map), false);
1351 let err = Config::deserialize(de).unwrap_err();
1352 assert!(err.to_string().contains("numpy.int64"), "{err}");
1353 }
1354
1355 #[test]
1356 fn should_deserialize_u8s_as_byte_buf() {
1357 #[derive(Debug, Deserialize, PartialEq)]
1358 struct ByteHolder(Vec<u8>);
1359
1360 let de = Deserializer::<DefaultAdapter>::new(NestedValue::U8s(vec![1, 2, 3, 4]), false);
1361 let result = ByteHolder::deserialize(de).unwrap();
1362 assert_eq!(result, ByteHolder(vec![1, 2, 3, 4]));
1363 }
1364}