extendr_api/
deserializer.rs

1//! Convert R objects to a wide variety of types.
2//!
3use 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
16/// Convert any R object to a Deserialize object.
17pub 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
25// Allow errors to propagate to extendr errors.
26impl 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
35// Convert unnamed lists to sequences.
36struct 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
57// Convert named lists to maps.
58struct 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
89// Allow us to use Integers, Doubles and Logicals.
90struct SliceGetter<'a, E> {
91    list: &'a [E],
92}
93
94// Allow us to use Integers and Rint.
95impl<'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
116// Allow us to use Doubles and Rfloat.
117impl<'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
138// Allow us to use Logicals and Rbool.
139impl<'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
160// Decode identifiers from the "names" attribute of lists.
161impl<'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
185// Get the variant name and content of an enum.
186impl<'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
215// Decode enum variants of various kinds.
216impl<'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
245// Enable sequences from Integers, Doubles and Logicals.
246impl<'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
267// Given an Robj, generate a value of many kinds.
268impl<'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                // Grubby hack that will go away once PRs are merged.
537                // use std::convert::TryInto;
538                // let val : Strings = val.clone().try_into().unwrap();
539                // let lg = StringGetter { list: &*val };
540                // Ok(visitor.visit_seq(lg)?)
541                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        // All sequences get converted to lists at the moment.
785        // We could check the first element and then assume the rest are the sme.
786        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        // TODO: find an example of this.
828        unimplemented!();
829        // let (de, variant) = data.variant()?;
830        // de.deserialize_any(self)
831    }
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}