1use crate::error::{Error, Result};
4use crate::na::CanBeNA;
5use crate::robj::{Attributes, Length, Robj, Types};
6use crate::scalar::{Rbool, Rfloat, Rint};
7use crate::wrapper::{Doubles, Integers, List, Logicals, Rstr, Strings};
8use crate::Rany;
9use serde::de::{
10 Deserialize, DeserializeSeed, Deserializer, EnumAccess, MapAccess, SeqAccess, VariantAccess,
11 Visitor,
12};
13use serde::forward_to_deserialize_any;
14use std::convert::TryFrom;
15
16pub fn from_robj<'de, T>(robj: &'de Robj) -> Result<T>
18where
19 T: Deserialize<'de>,
20{
21 let t = T::deserialize(robj)?;
22 Ok(t)
23}
24
25impl serde::de::Error for Error {
27 fn custom<T>(msg: T) -> Self
28 where
29 T: std::fmt::Display,
30 {
31 Error::Other(msg.to_string())
32 }
33}
34
35struct ListGetter<'a> {
37 list: &'a [Robj],
38}
39
40impl<'de> SeqAccess<'de> for ListGetter<'de> {
41 type Error = Error;
42
43 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
44 where
45 T: DeserializeSeed<'de>,
46 {
47 if self.list.is_empty() {
48 Ok(None)
49 } else {
50 let e = &self.list[0];
51 self.list = &self.list[1..];
52 seed.deserialize(e).map(Some)
53 }
54 }
55}
56
57struct NamedListGetter<'a> {
59 keys: &'a [Rstr],
60 values: &'a [Robj],
61}
62
63impl<'de> MapAccess<'de> for NamedListGetter<'de> {
64 type Error = Error;
65
66 fn next_key_seed<K>(&mut self, seed: K) -> Result<Option<K::Value>>
67 where
68 K: DeserializeSeed<'de>,
69 {
70 if self.keys.is_empty() {
71 Ok(None)
72 } else {
73 let e = &self.keys[0];
74 self.keys = &self.keys[1..];
75 seed.deserialize(e).map(Some)
76 }
77 }
78
79 fn next_value_seed<V>(&mut self, seed: V) -> Result<V::Value>
80 where
81 V: DeserializeSeed<'de>,
82 {
83 let e = &self.values[0];
84 self.values = &self.values[1..];
85 seed.deserialize(e)
86 }
87}
88
89struct SliceGetter<'a, E> {
91 list: &'a [E],
92}
93
94impl<'de> Deserializer<'de> for Rint {
96 type Error = Error;
97
98 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
99 where
100 V: Visitor<'de>,
101 {
102 if let Some(val) = self.into() {
103 visitor.visit_i32(val)
104 } else {
105 visitor.visit_unit()
106 }
107 }
108
109 forward_to_deserialize_any! {
110 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
111 bytes byte_buf option unit unit_struct newtype_struct seq tuple
112 tuple_struct map struct enum identifier ignored_any
113 }
114}
115
116impl<'de> Deserializer<'de> for Rfloat {
118 type Error = Error;
119
120 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
121 where
122 V: Visitor<'de>,
123 {
124 if let Some(val) = self.into() {
125 visitor.visit_f64(val)
126 } else {
127 visitor.visit_unit()
128 }
129 }
130
131 forward_to_deserialize_any! {
132 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
133 bytes byte_buf option unit unit_struct newtype_struct seq tuple
134 tuple_struct map struct enum identifier ignored_any
135 }
136}
137
138impl<'de> Deserializer<'de> for Rbool {
140 type Error = Error;
141
142 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
143 where
144 V: Visitor<'de>,
145 {
146 if let Some(val) = self.into() {
147 visitor.visit_bool(val)
148 } else {
149 visitor.visit_unit()
150 }
151 }
152
153 forward_to_deserialize_any! {
154 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
155 bytes byte_buf option unit unit_struct newtype_struct seq tuple
156 tuple_struct map struct enum identifier ignored_any
157 }
158}
159
160impl<'de> Deserializer<'de> for &'de Rstr {
162 type Error = Error;
163
164 fn deserialize_any<V>(self, _visitor: V) -> Result<V::Value>
165 where
166 V: Visitor<'de>,
167 {
168 unimplemented!()
169 }
170
171 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
172 where
173 V: Visitor<'de>,
174 {
175 visitor.visit_borrowed_str(self)
176 }
177
178 forward_to_deserialize_any! {
179 bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char string
180 str bytes byte_buf option unit unit_struct newtype_struct seq tuple
181 tuple_struct map struct enum ignored_any
182 }
183}
184
185impl<'de> EnumAccess<'de> for &'de Robj {
187 type Error = Error;
188 type Variant = Self;
189
190 fn variant_seed<V>(self, seed: V) -> Result<(V::Value, Self::Variant)>
191 where
192 V: DeserializeSeed<'de>,
193 {
194 match self.as_any() {
195 Rany::Strings(s) if s.len() == 1 => {
196 let variant = seed.deserialize(self)?;
197 Ok((variant, self))
198 }
199 Rany::List(list) if list.len() == 1 => {
200 if let Some(keys) = self.get_attrib(crate::wrapper::symbol::names_symbol()) {
201 if let Ok(keys) = Strings::try_from(keys) {
202 let keys = keys.as_slice();
203 let values = &list.as_slice()[0];
204 let variant = seed.deserialize(&keys[0])?;
205 return Ok((variant, values));
206 }
207 }
208 Err(Error::Other("Expected named List for enum".into()))
209 }
210 _ => Err(Error::Other("Expected String or List for enum".into())),
211 }
212 }
213}
214
215impl<'de> VariantAccess<'de> for &'de Robj {
217 type Error = Error;
218
219 fn unit_variant(self) -> Result<()> {
220 Ok(())
221 }
222
223 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value>
224 where
225 T: DeserializeSeed<'de>,
226 {
227 seed.deserialize(self)
228 }
229
230 fn tuple_variant<V>(self, _len: usize, visitor: V) -> Result<V::Value>
231 where
232 V: Visitor<'de>,
233 {
234 serde::de::Deserializer::deserialize_seq(self, visitor)
235 }
236
237 fn struct_variant<V>(self, _fields: &'static [&'static str], visitor: V) -> Result<V::Value>
238 where
239 V: Visitor<'de>,
240 {
241 serde::de::Deserializer::deserialize_map(self, visitor)
242 }
243}
244
245impl<'de, E: Deserializer<'de>> SeqAccess<'de> for SliceGetter<'de, E>
247where
248 Error: From<<E as Deserializer<'de>>::Error>,
249 E: Copy,
250{
251 type Error = Error;
252
253 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
254 where
255 T: DeserializeSeed<'de>,
256 {
257 if self.list.is_empty() {
258 Ok(None)
259 } else {
260 let res = seed.deserialize(self.list[0])?;
261 self.list = &self.list[1..];
262 Ok(Some(res))
263 }
264 }
265}
266
267impl<'de> Deserializer<'de> for &'de Robj {
269 type Error = Error;
270
271 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value>
272 where
273 V: Visitor<'de>,
274 {
275 let len = self.len();
276 match self.as_any() {
277 Rany::Null(_) => self.deserialize_unit(visitor),
278 Rany::Integers(_v) => {
279 if len == 1 {
280 self.deserialize_i32(visitor)
281 } else {
282 self.deserialize_seq(visitor)
283 }
284 }
285 Rany::Doubles(_v) => {
286 if len == 1 {
287 self.deserialize_f64(visitor)
288 } else {
289 self.deserialize_seq(visitor)
290 }
291 }
292 Rany::Logicals(_v) => {
293 if len == 1 {
294 self.deserialize_bool(visitor)
295 } else {
296 self.deserialize_seq(visitor)
297 }
298 }
299 Rany::List(_v) => self.deserialize_seq(visitor),
300 Rany::Strings(_v) => {
301 if len == 1 {
302 self.deserialize_str(visitor)
303 } else {
304 self.deserialize_seq(visitor)
305 }
306 }
307 _ => Err(Error::Other(format!(
308 "deserialize_any: unexpected {:?}",
309 self.rtype()
310 ))),
311 }
312 }
313
314 fn deserialize_unit<V>(self, visitor: V) -> Result<V::Value>
315 where
316 V: Visitor<'de>,
317 {
318 if let Rany::Null(_) = self.as_any() {
319 visitor.visit_unit()
320 } else {
321 Err(Error::ExpectedNull(self.clone()))
322 }
323 }
324
325 fn deserialize_bool<V>(self, visitor: V) -> Result<V::Value>
326 where
327 V: Visitor<'de>,
328 {
329 visitor.visit_bool(bool::try_from(self.clone())?)
330 }
331
332 fn deserialize_i8<V>(self, visitor: V) -> Result<V::Value>
333 where
334 V: Visitor<'de>,
335 {
336 visitor.visit_i8(i8::try_from(self.clone())?)
337 }
338
339 fn deserialize_i16<V>(self, visitor: V) -> Result<V::Value>
340 where
341 V: Visitor<'de>,
342 {
343 visitor.visit_i16(i16::try_from(self.clone())?)
344 }
345
346 fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value>
347 where
348 V: Visitor<'de>,
349 {
350 visitor.visit_i32(i32::try_from(self.clone())?)
351 }
352
353 fn deserialize_i64<V>(self, visitor: V) -> Result<V::Value>
354 where
355 V: Visitor<'de>,
356 {
357 visitor.visit_i64(i64::try_from(self.clone())?)
358 }
359
360 fn deserialize_i128<V>(self, visitor: V) -> Result<V::Value>
361 where
362 V: Visitor<'de>,
363 {
364 visitor.visit_i128(i64::try_from(self.clone())? as i128)
365 }
366
367 fn deserialize_u8<V>(self, visitor: V) -> Result<V::Value>
368 where
369 V: Visitor<'de>,
370 {
371 visitor.visit_u8(u8::try_from(self.clone())?)
372 }
373
374 fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value>
375 where
376 V: Visitor<'de>,
377 {
378 visitor.visit_u16(u16::try_from(self.clone())?)
379 }
380
381 fn deserialize_u32<V>(self, visitor: V) -> Result<V::Value>
382 where
383 V: Visitor<'de>,
384 {
385 visitor.visit_u32(u32::try_from(self.clone())?)
386 }
387
388 fn deserialize_u64<V>(self, visitor: V) -> Result<V::Value>
389 where
390 V: Visitor<'de>,
391 {
392 visitor.visit_u64(u64::try_from(self.clone())?)
393 }
394
395 fn deserialize_u128<V>(self, visitor: V) -> Result<V::Value>
396 where
397 V: Visitor<'de>,
398 {
399 visitor.visit_u128(u64::try_from(self.clone())? as u128)
400 }
401
402 fn deserialize_f32<V>(self, visitor: V) -> Result<V::Value>
403 where
404 V: Visitor<'de>,
405 {
406 visitor.visit_f32(f32::try_from(self.clone())?)
407 }
408
409 fn deserialize_f64<V>(self, visitor: V) -> Result<V::Value>
410 where
411 V: Visitor<'de>,
412 {
413 visitor.visit_f64(f64::try_from(self.clone())?)
414 }
415
416 fn deserialize_char<V>(self, visitor: V) -> Result<V::Value>
417 where
418 V: Visitor<'de>,
419 {
420 let s = <&str>::try_from(self.clone())?;
421 let mut c = s.chars();
422 if let Some(ch) = c.next() {
423 if c.next().is_none() {
424 return visitor.visit_char(ch);
425 }
426 }
427 Err(Error::ExpectedString(self.clone()))
428 }
429
430 fn deserialize_str<V>(self, visitor: V) -> Result<V::Value>
431 where
432 V: Visitor<'de>,
433 {
434 visitor.visit_borrowed_str(<&str>::try_from(self.clone())?)
435 }
436
437 fn deserialize_string<V>(self, visitor: V) -> Result<V::Value>
438 where
439 V: Visitor<'de>,
440 {
441 visitor.visit_string(<&str>::try_from(self.clone())?.into())
442 }
443
444 fn deserialize_bytes<V>(self, visitor: V) -> Result<V::Value>
445 where
446 V: Visitor<'de>,
447 {
448 if let Rany::Raw(val) = self.as_any() {
449 visitor.visit_bytes(val.as_slice())
450 } else {
451 Err(Error::ExpectedRaw(self.clone()))
452 }
453 }
454
455 fn deserialize_byte_buf<V>(self, visitor: V) -> Result<V::Value>
456 where
457 V: Visitor<'de>,
458 {
459 if let Rany::Raw(val) = self.as_any() {
460 visitor.visit_byte_buf(val.as_slice().to_owned())
461 } else {
462 Err(Error::ExpectedRaw(self.clone()))
463 }
464 }
465
466 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value>
467 where
468 V: Visitor<'de>,
469 {
470 if let Rany::Null(_) = self.as_any() {
471 visitor.visit_none()
472 } else if self.is_na() {
473 visitor.visit_none()
474 } else {
475 visitor.visit_some(self)
476 }
477 }
478
479 fn deserialize_unit_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value>
480 where
481 V: Visitor<'de>,
482 {
483 self.deserialize_unit(visitor)
484 }
485
486 fn deserialize_newtype_struct<V>(self, _name: &str, visitor: V) -> Result<V::Value>
487 where
488 V: Visitor<'de>,
489 {
490 visitor.visit_newtype_struct(self)
491 }
492
493 fn deserialize_tuple<V>(self, _len: usize, visitor: V) -> Result<V::Value>
494 where
495 V: Visitor<'de>,
496 {
497 self.deserialize_seq(visitor)
498 }
499
500 fn deserialize_tuple_struct<V>(
501 self,
502 _name: &'static str,
503 _len: usize,
504 visitor: V,
505 ) -> Result<V::Value>
506 where
507 V: Visitor<'de>,
508 {
509 self.deserialize_seq(visitor)
510 }
511
512 fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value>
513 where
514 V: Visitor<'de>,
515 {
516 match self.as_any() {
517 Rany::List(val) => {
518 let lg = ListGetter {
519 list: val.as_slice(),
520 };
521 Ok(visitor.visit_seq(lg)?)
522 }
523 Rany::Integers(val) => {
524 let lg = SliceGetter { list: val };
525 Ok(visitor.visit_seq(lg)?)
526 }
527 Rany::Doubles(val) => {
528 let lg = SliceGetter { list: val };
529 Ok(visitor.visit_seq(lg)?)
530 }
531 Rany::Logicals(val) => {
532 let lg = SliceGetter { list: val };
533 Ok(visitor.visit_seq(lg)?)
534 }
535 Rany::Strings(_val) => {
536 unimplemented!("Deserialize shortcut for Strings");
542 }
543 _ => Err(Error::ExpectedList(self.clone())),
544 }
545 }
546
547 fn deserialize_map<V>(self, visitor: V) -> Result<V::Value>
548 where
549 V: Visitor<'de>,
550 {
551 match self.as_any() {
552 Rany::List(val) => {
553 if let Some(keys) = self.get_attrib(crate::wrapper::symbol::names_symbol()) {
554 if let Ok(keys) = Strings::try_from(keys) {
555 let keys = keys.as_slice();
556 let lg = NamedListGetter {
557 keys,
558 values: val.as_slice(),
559 };
560 return visitor.visit_map(lg);
561 }
562 }
563 Err(Error::ExpectedList(self.clone()))
564 }
565 _ => Err(Error::ExpectedList(self.clone())),
566 }
567 }
568
569 fn deserialize_struct<V>(
570 self,
571 _name: &'static str,
572 _fields: &'static [&'static str],
573 visitor: V,
574 ) -> Result<V::Value>
575 where
576 V: Visitor<'de>,
577 {
578 self.deserialize_map(visitor)
579 }
580
581 fn deserialize_identifier<V>(self, visitor: V) -> Result<V::Value>
582 where
583 V: Visitor<'de>,
584 {
585 self.deserialize_str(visitor)
586 }
587
588 fn deserialize_ignored_any<V>(self, visitor: V) -> Result<V::Value>
589 where
590 V: Visitor<'de>,
591 {
592 self.deserialize_any(visitor)
593 }
594
595 fn deserialize_enum<V>(
596 self,
597 _name: &'static str,
598 _variants: &'static [&'static str],
599 visitor: V,
600 ) -> Result<V::Value>
601 where
602 V: Visitor<'de>,
603 {
604 visitor.visit_enum(self)
605 }
606}
607
608struct RintVisitor;
609
610impl<'de> Visitor<'de> for RintVisitor {
611 type Value = Rint;
612
613 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
614 formatter.write_str("an integer between -2^31+1 and 2^31")
615 }
616
617 fn visit_i32<E>(self, value: i32) -> std::result::Result<Self::Value, E>
618 where
619 E: serde::de::Error,
620 {
621 Ok(value.into())
622 }
623
624 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
625 where
626 E: serde::de::Error,
627 {
628 Ok(Rint::na())
629 }
630}
631
632impl<'de> Deserialize<'de> for Rint {
633 fn deserialize<D>(deserializer: D) -> std::result::Result<Rint, D::Error>
634 where
635 D: Deserializer<'de>,
636 {
637 deserializer.deserialize_i32(RintVisitor)
638 }
639}
640
641struct RfloatVisitor;
642
643impl<'de> Visitor<'de> for RfloatVisitor {
644 type Value = Rfloat;
645
646 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
647 formatter.write_str("a floating point value")
648 }
649
650 fn visit_f64<E>(self, value: f64) -> std::result::Result<Self::Value, E>
651 where
652 E: serde::de::Error,
653 {
654 Ok(value.into())
655 }
656
657 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
658 where
659 E: serde::de::Error,
660 {
661 Ok(Rfloat::na())
662 }
663}
664
665impl<'de> Deserialize<'de> for Rfloat {
666 fn deserialize<D>(deserializer: D) -> std::result::Result<Rfloat, D::Error>
667 where
668 D: Deserializer<'de>,
669 {
670 deserializer.deserialize_f64(RfloatVisitor)
671 }
672}
673
674struct RboolVisitor;
675
676impl<'de> Visitor<'de> for RboolVisitor {
677 type Value = Rbool;
678
679 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
680 formatter.write_str("a boolean point value")
681 }
682
683 fn visit_bool<E>(self, value: bool) -> std::result::Result<Self::Value, E>
684 where
685 E: serde::de::Error,
686 {
687 Ok(value.into())
688 }
689
690 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
691 where
692 E: serde::de::Error,
693 {
694 Ok(Rbool::na())
695 }
696}
697
698impl<'de> Deserialize<'de> for Rbool {
699 fn deserialize<D>(deserializer: D) -> std::result::Result<Rbool, D::Error>
700 where
701 D: Deserializer<'de>,
702 {
703 deserializer.deserialize_bool(RboolVisitor)
704 }
705}
706
707struct RobjVisitor;
708
709impl<'de> Visitor<'de> for RobjVisitor {
710 type Value = Robj;
711
712 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
713 formatter.write_str("a value convertable to a Robj")
714 }
715
716 fn visit_bool<E>(self, value: bool) -> std::result::Result<Self::Value, E>
717 where
718 E: serde::de::Error,
719 {
720 Ok(value.into())
721 }
722
723 fn visit_i64<E>(self, v: i64) -> std::result::Result<Self::Value, E>
724 where
725 E: serde::de::Error,
726 {
727 if v > i32::MIN as i64 && v <= i32::MAX as i64 {
728 Ok((v as i32).into())
729 } else {
730 Ok((v as f64).into())
731 }
732 }
733
734 fn visit_u64<E>(self, v: u64) -> std::result::Result<Self::Value, E>
735 where
736 E: serde::de::Error,
737 {
738 if v <= i32::MAX as u64 {
739 Ok((v as i32).into())
740 } else {
741 Ok((v as f64).into())
742 }
743 }
744
745 fn visit_f64<E>(self, v: f64) -> std::result::Result<Self::Value, E>
746 where
747 E: serde::de::Error,
748 {
749 Ok(v.into())
750 }
751
752 fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
753 where
754 E: serde::de::Error,
755 {
756 Ok(v.into())
757 }
758
759 fn visit_bytes<E>(self, v: &[u8]) -> std::result::Result<Self::Value, E>
760 where
761 E: serde::de::Error,
762 {
763 Ok(v.into())
764 }
765
766 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
767 where
768 E: serde::de::Error,
769 {
770 Ok(Robj::from(()))
771 }
772
773 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
774 where
775 D: Deserializer<'de>,
776 {
777 deserializer.deserialize_any(self)
778 }
779
780 fn visit_seq<A>(self, mut seq: A) -> std::result::Result<Self::Value, A::Error>
781 where
782 A: SeqAccess<'de>,
783 {
784 let mut values: Vec<Robj> = Vec::with_capacity(seq.size_hint().unwrap_or(8));
787 while let Some(value) = seq.next_element()? {
788 values.push(value);
789 }
790 Ok(values.into())
791 }
792
793 fn visit_map<M>(self, mut access: M) -> std::result::Result<Self::Value, M::Error>
794 where
795 M: MapAccess<'de>,
796 {
797 let mut keys: Vec<&str> = Vec::with_capacity(access.size_hint().unwrap_or(8));
798 let mut values: Vec<Robj> = Vec::with_capacity(access.size_hint().unwrap_or(8));
799
800 while let Some((key, value)) = access.next_entry()? {
801 keys.push(key);
802 values.push(value);
803 }
804 let mut result = List::from_values(values);
805 result.set_names(keys).unwrap();
806 Ok(result.into())
807 }
808
809 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
810 where
811 E: serde::de::Error,
812 {
813 Ok(Robj::from(()))
814 }
815
816 fn visit_newtype_struct<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
817 where
818 D: Deserializer<'de>,
819 {
820 deserializer.deserialize_any(self)
821 }
822
823 fn visit_enum<A>(self, _data: A) -> std::result::Result<Self::Value, A::Error>
824 where
825 A: EnumAccess<'de>,
826 {
827 unimplemented!();
829 }
832}
833
834impl<'de> Deserialize<'de> for Robj {
835 fn deserialize<D>(deserializer: D) -> std::result::Result<Robj, D::Error>
836 where
837 D: Deserializer<'de>,
838 {
839 deserializer.deserialize_any(RobjVisitor)
840 }
841}
842
843struct IntegersVisitor;
844
845impl<'de> Visitor<'de> for IntegersVisitor {
846 type Value = Integers;
847
848 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
849 formatter.write_str("a value convertable to Integers")
850 }
851
852 fn visit_i64<E>(self, v: i64) -> std::result::Result<Self::Value, E>
853 where
854 E: serde::de::Error,
855 {
856 if v > i32::MIN as i64 && v <= i32::MAX as i64 {
857 Ok(Integers::from_values([v as i32]))
858 } else {
859 Err(serde::de::Error::custom("out of range for Integers"))
860 }
861 }
862
863 fn visit_u64<E>(self, v: u64) -> std::result::Result<Self::Value, E>
864 where
865 E: serde::de::Error,
866 {
867 if v <= i32::MAX as u64 {
868 Ok(Integers::from_values([v as i32]))
869 } else {
870 Err(serde::de::Error::custom("out of range for Integers"))
871 }
872 }
873
874 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
875 where
876 E: serde::de::Error,
877 {
878 Ok(Integers::from_values([Rint::na()]))
879 }
880
881 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
882 where
883 D: Deserializer<'de>,
884 {
885 deserializer.deserialize_any(self)
886 }
887
888 fn visit_seq<A>(self, mut seq: A) -> std::result::Result<Self::Value, A::Error>
889 where
890 A: SeqAccess<'de>,
891 {
892 let mut values: Vec<Rint> = Vec::with_capacity(seq.size_hint().unwrap_or(8));
893 while let Some(value) = seq.next_element()? {
894 values.push(value);
895 }
896 Ok(Integers::from_values(values))
897 }
898
899 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
900 where
901 E: serde::de::Error,
902 {
903 Ok(Integers::from_values([Rint::na()]))
904 }
905}
906
907impl<'de> Deserialize<'de> for Integers {
908 fn deserialize<D>(deserializer: D) -> std::result::Result<Integers, D::Error>
909 where
910 D: Deserializer<'de>,
911 {
912 deserializer.deserialize_any(IntegersVisitor)
913 }
914}
915
916struct DoublesVisitor;
917
918impl<'de> Visitor<'de> for DoublesVisitor {
919 type Value = Doubles;
920
921 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
922 formatter.write_str("a value convertable to Doubles")
923 }
924
925 fn visit_i64<E>(self, v: i64) -> std::result::Result<Self::Value, E>
926 where
927 E: serde::de::Error,
928 {
929 Ok(Doubles::from_values([v as f64]))
930 }
931
932 fn visit_u64<E>(self, v: u64) -> std::result::Result<Self::Value, E>
933 where
934 E: serde::de::Error,
935 {
936 Ok(Doubles::from_values([v as f64]))
937 }
938
939 fn visit_f64<E>(self, v: f64) -> std::result::Result<Self::Value, E>
940 where
941 E: serde::de::Error,
942 {
943 Ok(Doubles::from_values([v]))
944 }
945
946 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
947 where
948 E: serde::de::Error,
949 {
950 Ok(Doubles::from_values([Rfloat::na()]))
951 }
952
953 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
954 where
955 D: Deserializer<'de>,
956 {
957 deserializer.deserialize_any(self)
958 }
959
960 fn visit_seq<A>(self, mut seq: A) -> std::result::Result<Self::Value, A::Error>
961 where
962 A: SeqAccess<'de>,
963 {
964 let mut values: Vec<Rfloat> = Vec::with_capacity(seq.size_hint().unwrap_or(8));
965 while let Some(value) = seq.next_element()? {
966 values.push(value);
967 }
968 Ok(Doubles::from_values(values))
969 }
970
971 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
972 where
973 E: serde::de::Error,
974 {
975 Ok(Doubles::from_values([Rfloat::na()]))
976 }
977}
978
979impl<'de> Deserialize<'de> for Doubles {
980 fn deserialize<D>(deserializer: D) -> std::result::Result<Doubles, D::Error>
981 where
982 D: Deserializer<'de>,
983 {
984 deserializer.deserialize_any(DoublesVisitor)
985 }
986}
987
988struct LogicalsVisitor;
989
990impl<'de> Visitor<'de> for LogicalsVisitor {
991 type Value = Logicals;
992
993 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
994 formatter.write_str("a value convertable to Logicals")
995 }
996
997 fn visit_bool<E>(self, v: bool) -> std::result::Result<Self::Value, E>
998 where
999 E: serde::de::Error,
1000 {
1001 Ok(Logicals::from_values([v]))
1002 }
1003
1004 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
1005 where
1006 E: serde::de::Error,
1007 {
1008 Ok(Logicals::from_values([Rbool::na()]))
1009 }
1010
1011 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
1012 where
1013 D: Deserializer<'de>,
1014 {
1015 deserializer.deserialize_any(self)
1016 }
1017
1018 fn visit_seq<A>(self, mut seq: A) -> std::result::Result<Self::Value, A::Error>
1019 where
1020 A: SeqAccess<'de>,
1021 {
1022 let mut values: Vec<Rbool> = Vec::with_capacity(seq.size_hint().unwrap_or(8));
1023 while let Some(value) = seq.next_element()? {
1024 values.push(value);
1025 }
1026 Ok(Logicals::from_values(values))
1027 }
1028
1029 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
1030 where
1031 E: serde::de::Error,
1032 {
1033 Ok(Logicals::from_values([Rbool::na()]))
1034 }
1035}
1036
1037impl<'de> Deserialize<'de> for Logicals {
1038 fn deserialize<D>(deserializer: D) -> std::result::Result<Logicals, D::Error>
1039 where
1040 D: Deserializer<'de>,
1041 {
1042 deserializer.deserialize_any(LogicalsVisitor)
1043 }
1044}
1045
1046struct StringsVisitor;
1047
1048impl<'de> Visitor<'de> for StringsVisitor {
1049 type Value = Strings;
1050
1051 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
1052 formatter.write_str("a value convertable to Strings")
1053 }
1054
1055 fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
1056 where
1057 E: serde::de::Error,
1058 {
1059 Ok(v.into())
1060 }
1061
1062 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
1063 where
1064 E: serde::de::Error,
1065 {
1066 Ok(Strings::from_values([<&str>::na()]))
1067 }
1068
1069 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
1070 where
1071 D: Deserializer<'de>,
1072 {
1073 deserializer.deserialize_any(self)
1074 }
1075
1076 fn visit_seq<A>(self, mut seq: A) -> std::result::Result<Self::Value, A::Error>
1077 where
1078 A: SeqAccess<'de>,
1079 {
1080 let mut values: Vec<Rstr> = Vec::with_capacity(seq.size_hint().unwrap_or(8));
1081 while let Some(value) = seq.next_element()? {
1082 values.push(value);
1083 }
1084 Ok(Strings::from_values(values))
1085 }
1086
1087 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
1088 where
1089 E: serde::de::Error,
1090 {
1091 Ok(Strings::from_values([<&str>::na()]))
1092 }
1093}
1094
1095impl<'de> Deserialize<'de> for Strings {
1096 fn deserialize<D>(deserializer: D) -> std::result::Result<Strings, D::Error>
1097 where
1098 D: Deserializer<'de>,
1099 {
1100 deserializer.deserialize_any(StringsVisitor)
1101 }
1102}
1103
1104struct RstrVisitor;
1105
1106impl<'de> Visitor<'de> for RstrVisitor {
1107 type Value = Rstr;
1108
1109 fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
1110 formatter.write_str("a value convertable to Rstr")
1111 }
1112
1113 fn visit_str<E>(self, v: &str) -> std::result::Result<Self::Value, E>
1114 where
1115 E: serde::de::Error,
1116 {
1117 Ok(v.into())
1118 }
1119
1120 fn visit_none<E>(self) -> std::result::Result<Self::Value, E>
1121 where
1122 E: serde::de::Error,
1123 {
1124 Ok(Rstr::na())
1125 }
1126
1127 fn visit_some<D>(self, deserializer: D) -> std::result::Result<Self::Value, D::Error>
1128 where
1129 D: Deserializer<'de>,
1130 {
1131 deserializer.deserialize_any(self)
1132 }
1133
1134 fn visit_unit<E>(self) -> std::result::Result<Self::Value, E>
1135 where
1136 E: serde::de::Error,
1137 {
1138 Ok(Rstr::na())
1139 }
1140}
1141
1142impl<'de> Deserialize<'de> for Rstr {
1143 fn deserialize<D>(deserializer: D) -> std::result::Result<Rstr, D::Error>
1144 where
1145 D: Deserializer<'de>,
1146 {
1147 deserializer.deserialize_any(RstrVisitor)
1148 }
1149}