Skip to main content

extendr_api/
serializer.rs

1//! See <https://serde.rs/impl-serializer.html>
2
3use crate::error::{Error, Result};
4use crate::na::CanBeNA;
5use crate::robj::{Attributes, GetSexp, Length, Rinternals, Types};
6use crate::scalar::{Rbool, Rfloat, Rint};
7use crate::wrapper::{
8    Doubles, Environment, Expressions, Function, Integers, Language, Logicals, Pairlist, Primitive,
9    Promise, Raw, Rstr, Symbol, S4,
10};
11use crate::{List, Rany, Robj};
12use serde::{ser, Serialize};
13
14impl ser::Error for Error {
15    fn custom<T: std::fmt::Display>(msg: T) -> Self {
16        Error::from(msg.to_string())
17    }
18}
19
20struct RobjSerializer {
21    robj: Option<Robj>,
22}
23
24struct SerializeSeq<'a> {
25    values: Vec<Robj>,
26    parent: &'a mut RobjSerializer,
27}
28
29struct SerializeTuple<'a> {
30    values: Vec<Robj>,
31    parent: &'a mut RobjSerializer,
32}
33
34struct SerializeTupleStruct<'a> {
35    values: Vec<Robj>,
36    parent: &'a mut RobjSerializer,
37}
38
39struct SerializeTupleVariant<'a> {
40    values: Vec<Robj>,
41    parent: &'a mut RobjSerializer,
42    variant: String,
43}
44
45struct SerializeMap<'a> {
46    values: Vec<(String, Robj)>,
47    key: String,
48    parent: &'a mut RobjSerializer,
49}
50
51struct SerializeStruct<'a> {
52    values: Vec<(String, Robj)>,
53    parent: &'a mut RobjSerializer,
54}
55
56struct SerializeStructVariant<'a> {
57    values: Vec<(String, Robj)>,
58    parent: &'a mut RobjSerializer,
59    variant: String,
60}
61
62/// Convert a serializable object to a Robj.
63///
64/// Requires the "serde" feature.
65///
66/// ```toml
67/// extendr-api = { version = "0.4", features = ["serde"] }
68/// ```
69///
70/// Example:
71///
72/// ```
73/// use extendr_api::prelude::*;
74/// use extendr_api::serializer::to_robj;
75/// use serde::Serialize;
76/// test! {
77///     #[derive(Serialize)]
78///     struct Test {
79///         int: i32,
80///         seq: Vec<&'static str>,
81///     }
82///
83///     let test = Test {
84///         int: 1,
85///         seq: vec!["a", "b"],
86///     };
87///
88///     let expected = list!(int=1, seq=list!("a", "b"));
89///     assert_eq!(to_robj(&test).unwrap(), Robj::from(expected));
90/// }
91/// ```
92pub fn to_robj<T>(value: &T) -> Result<Robj>
93where
94    T: Serialize,
95{
96    let mut serializer = RobjSerializer { robj: None };
97
98    value.serialize(&mut serializer)?;
99    serializer
100        .robj
101        .ok_or_else(|| Error::Other("serializer produced no value".into()))
102}
103
104impl<'a> ser::Serializer for &'a mut RobjSerializer {
105    // The output type produced by this `RobjSerializer` during successful
106    // serialization. Most serializers that produce text or binary output should
107    // set `Ok = ()` and serialize into an `io::Write` or buffer contained
108    // within the `RobjSerializer` instance, as happens here. Serializers that build
109    // in-memory data structures may be simplified by using `Ok` to propagate
110    // the data structure around.
111    type Ok = ();
112
113    // The error type when some error occurs during serialization.
114    type Error = Error;
115
116    // Associated types for keeping track of additional state while serializing
117    // compound data structures like sequences and maps. In this case no
118    // additional state is required beyond what is already stored in the
119    // RobjSerializer struct.
120    type SerializeSeq = self::SerializeSeq<'a>;
121    type SerializeTuple = self::SerializeTuple<'a>;
122    type SerializeTupleStruct = self::SerializeTupleStruct<'a>;
123    type SerializeTupleVariant = self::SerializeTupleVariant<'a>;
124    type SerializeMap = self::SerializeMap<'a>;
125    type SerializeStruct = self::SerializeStruct<'a>;
126    type SerializeStructVariant = self::SerializeStructVariant<'a>;
127
128    /// Map a bool to a Robj.
129    fn serialize_bool(self, v: bool) -> Result<()> {
130        self.robj = Some(Robj::from(v));
131        Ok(())
132    }
133
134    /// Map a i8 to a Robj.
135    fn serialize_i8(self, v: i8) -> Result<()> {
136        self.robj = Some(Robj::from(v));
137        Ok(())
138    }
139
140    /// Map a i16 to a Robj.
141    fn serialize_i16(self, v: i16) -> Result<()> {
142        self.robj = Some(Robj::from(v));
143        Ok(())
144    }
145
146    /// Map a i32 to a Robj.
147    fn serialize_i32(self, v: i32) -> Result<()> {
148        self.robj = Some(Robj::from(v));
149        Ok(())
150    }
151
152    /// Map a i64 to a Robj.
153    fn serialize_i64(self, v: i64) -> Result<()> {
154        self.robj = Some(Robj::from(v));
155        Ok(())
156    }
157
158    /// Map a u8 to a Robj.
159    fn serialize_u8(self, v: u8) -> Result<()> {
160        self.robj = Some(Robj::from(v));
161        Ok(())
162    }
163
164    /// Map a u16 to a Robj.
165    fn serialize_u16(self, v: u16) -> Result<()> {
166        self.robj = Some(Robj::from(v));
167        Ok(())
168    }
169
170    /// Map a u32 to a Robj.
171    fn serialize_u32(self, v: u32) -> Result<()> {
172        self.robj = Some(Robj::from(v));
173        Ok(())
174    }
175
176    /// Map a u64 to a Robj.
177    fn serialize_u64(self, v: u64) -> Result<()> {
178        self.robj = Some(Robj::from(v));
179        Ok(())
180    }
181
182    /// Map a f32 to a Robj.
183    fn serialize_f32(self, v: f32) -> Result<()> {
184        self.robj = Some(Robj::from(v));
185        Ok(())
186    }
187
188    /// Map a f64 to a Robj.
189    fn serialize_f64(self, v: f64) -> Result<()> {
190        self.robj = Some(Robj::from(v));
191        Ok(())
192    }
193
194    /// Map a char to a Robj string.
195    fn serialize_char(self, v: char) -> Result<()> {
196        self.robj = Some(Robj::from(v.to_string()));
197        Ok(())
198    }
199
200    /// Map a string slice to a Robj string.
201    fn serialize_str(self, v: &str) -> Result<()> {
202        self.robj = Some(Robj::from(v));
203        Ok(())
204    }
205
206    /// Raw objects.
207    fn serialize_bytes(self, v: &[u8]) -> Result<()> {
208        self.robj = Some(Robj::from(v));
209        Ok(())
210    }
211
212    /// None of an option is NULL.
213    fn serialize_none(self) -> Result<()> {
214        self.robj = Some(Robj::null());
215        Ok(())
216    }
217
218    /// Some of an option is that value.
219    fn serialize_some<T>(self, value: &T) -> Result<()>
220    where
221        T: ?Sized + Serialize,
222    {
223        value.serialize(self)
224    }
225
226    // In Serde, unit means an anonymous value containing no data. Map this to
227    // R as `NULL`.
228    fn serialize_unit(self) -> Result<()> {
229        self.robj = Some(Robj::null());
230        Ok(())
231    }
232
233    // Unit struct means a named value containing no data. Again, since there is
234    // no data, map this to R as `NULL`. There is no need to serialize the
235    // name in most formats.
236    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
237        self.serialize_unit()
238    }
239
240    /// Unit variant: Enum::Name
241    fn serialize_unit_variant(
242        self,
243        _name: &'static str,
244        _variant_index: u32,
245        variant: &'static str,
246    ) -> Result<()> {
247        self.robj = Some(Robj::from(variant));
248        Ok(())
249    }
250
251    /// Wrapper struct: Wrap(T)
252    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
253    where
254        T: ?Sized + Serialize,
255    {
256        value.serialize(self)
257    }
258
259    /// Wrapper struct in enum: Enum::Wrap(T)
260    fn serialize_newtype_variant<T>(
261        self,
262        _name: &'static str,
263        _variant_index: u32,
264        variant: &'static str,
265        value: &T,
266    ) -> Result<()>
267    where
268        T: ?Sized + Serialize,
269    {
270        let value = to_robj(&value)?;
271        let list = List::from_pairs([(variant, value)]);
272        self.robj = Some(list.into());
273        Ok(())
274    }
275
276    /// Start of a vector or other sequence.
277    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
278        let vec = if let Some(len) = len {
279            Vec::with_capacity(len)
280        } else {
281            Vec::new()
282        };
283        Ok(SerializeSeq {
284            values: vec,
285            parent: self,
286        })
287    }
288
289    /// Start of a tuple.
290    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
291        Ok(SerializeTuple {
292            values: Vec::with_capacity(len),
293            parent: self,
294        })
295    }
296
297    /// Start of a tuple struct eg. `Point(i32, i32)`.
298    fn serialize_tuple_struct(
299        self,
300        _name: &'static str,
301        len: usize,
302    ) -> Result<Self::SerializeTupleStruct> {
303        Ok(Self::SerializeTupleStruct {
304            values: Vec::with_capacity(len),
305            parent: self,
306        })
307    }
308
309    /// Start of a struct variant eg. `Enum::Point{ x: i32, y: i32}`.
310    fn serialize_tuple_variant(
311        self,
312        _name: &'static str,
313        _variant_index: u32,
314        variant: &'static str,
315        len: usize,
316    ) -> Result<Self::SerializeTupleVariant> {
317        Ok(SerializeTupleVariant {
318            values: Vec::with_capacity(len),
319            variant: variant.to_string(),
320            parent: self,
321        })
322    }
323
324    /// Start of a map. We require that keys must be strings.
325    fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
326        Ok(SerializeMap {
327            values: Vec::new(),
328            key: String::new(),
329            parent: self,
330        })
331    }
332
333    /// Start of a struct. Collect just the values in a list.
334    fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
335        Ok(SerializeStruct {
336            values: Vec::with_capacity(len),
337            parent: self,
338        })
339    }
340
341    /// eg. `Enum::Point { x: i32, y: i32 }`
342    fn serialize_struct_variant(
343        self,
344        _name: &'static str,
345        _variant_index: u32,
346        variant: &'static str,
347        _len: usize,
348    ) -> Result<Self::SerializeStructVariant> {
349        Ok(SerializeStructVariant {
350            values: Vec::new(),
351            variant: variant.to_string(),
352            parent: self,
353        })
354    }
355}
356
357/// Arrays, vectors and slices -> List
358impl<'a> ser::SerializeSeq for self::SerializeSeq<'a> {
359    // Must match the `Ok` type of the serializer.
360    type Ok = ();
361    // Must match the `Error` type of the serializer.
362    type Error = Error;
363
364    // Serialize a single element of the sequence.
365    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
366    where
367        T: ?Sized + Serialize,
368    {
369        self.values.push(to_robj(&value)?);
370        Ok(())
371    }
372
373    // Close the sequence.
374    fn end(self) -> Result<()> {
375        self.parent.robj = Some(List::from_values(self.values).into());
376        Ok(())
377    }
378}
379
380/// Tuples -> list!(...)
381impl<'a> ser::SerializeTuple for SerializeTuple<'a> {
382    type Ok = ();
383    type Error = Error;
384
385    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
386    where
387        T: ?Sized + Serialize,
388    {
389        self.values.push(to_robj(&value)?);
390        Ok(())
391    }
392
393    fn end(self) -> Result<()> {
394        self.parent.robj = Some(List::from_values(self.values).into());
395        Ok(())
396    }
397}
398
399/// Tuple structs -> list!(...)
400impl<'a> ser::SerializeTupleStruct for self::SerializeTupleStruct<'a> {
401    type Ok = ();
402    type Error = Error;
403
404    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
405    where
406        T: ?Sized + Serialize,
407    {
408        self.values.push(to_robj(&value)?);
409        Ok(())
410    }
411
412    fn end(self) -> Result<()> {
413        self.parent.robj = Some(List::from_values(self.values).into());
414        Ok(())
415    }
416}
417
418/// Tuple variants -> list!(variant = list!(...))
419impl<'a> ser::SerializeTupleVariant for self::SerializeTupleVariant<'a> {
420    type Ok = ();
421    type Error = Error;
422
423    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
424    where
425        T: ?Sized + Serialize,
426    {
427        self.values.push(to_robj(&value)?);
428        Ok(())
429    }
430
431    fn end(self) -> Result<()> {
432        let value = List::from_values(self.values).into();
433        let list = List::from_pairs([(self.variant, value)]);
434        self.parent.robj = Some(list.into());
435        Ok(())
436    }
437}
438
439/// Maps must have string keys -> list!(key=value, ...)
440impl<'a> ser::SerializeMap for self::SerializeMap<'a> {
441    type Ok = ();
442    type Error = Error;
443
444    fn serialize_key<T>(&mut self, key: &T) -> Result<()>
445    where
446        T: ?Sized + Serialize,
447    {
448        let key = to_robj(&key)?;
449        if let Some(key_str) = key.as_str() {
450            self.key = key_str.to_string();
451            Ok(())
452        } else {
453            Err(Error::ExpectedString(key))
454        }
455    }
456
457    fn serialize_value<T>(&mut self, value: &T) -> Result<()>
458    where
459        T: ?Sized + Serialize,
460    {
461        let key = std::mem::take(&mut self.key);
462        self.values.push((key, to_robj(&value)?));
463        Ok(())
464    }
465
466    fn end(self) -> Result<()> {
467        self.parent.robj = Some(List::from_pairs(self.values).into());
468        Ok(())
469    }
470}
471
472// Structs are like maps in which the keys are constrained to be compile-time
473// constant strings.
474impl<'a> ser::SerializeStruct for self::SerializeStruct<'a> {
475    type Ok = ();
476    type Error = Error;
477
478    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
479    where
480        T: ?Sized + Serialize,
481    {
482        self.values.push((key.to_string(), to_robj(&value)?));
483        Ok(())
484    }
485
486    fn end(self) -> Result<()> {
487        self.parent.robj = Some(List::from_pairs(self.values).into());
488        Ok(())
489    }
490}
491
492// Similar to `SerializeTupleVariant`.
493impl<'a> ser::SerializeStructVariant for self::SerializeStructVariant<'a> {
494    type Ok = ();
495    type Error = Error;
496
497    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
498    where
499        T: ?Sized + Serialize,
500    {
501        self.values.push((key.to_string(), to_robj(&value)?));
502        Ok(())
503    }
504
505    fn end(self) -> Result<()> {
506        let value = List::from_pairs(self.values).into();
507        let list = List::from_pairs([(self.variant, value)]);
508        self.parent.robj = Some(list.into());
509        Ok(())
510    }
511}
512
513impl ser::Serialize for Symbol {
514    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
515    where
516        S: ser::Serializer,
517    {
518        serializer.serialize_str(self.as_str())
519    }
520}
521
522impl ser::Serialize for Primitive {
523    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
524    where
525        S: ser::Serializer,
526    {
527        let string = self.deparse().map_err(ser::Error::custom)?;
528        string.serialize(serializer)
529    }
530}
531
532impl ser::Serialize for Expressions {
533    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
534    where
535        S: ser::Serializer,
536    {
537        let string = self.deparse().map_err(ser::Error::custom)?;
538        string.serialize(serializer)
539    }
540}
541
542impl ser::Serialize for S4 {
543    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
544    where
545        S: ser::Serializer,
546    {
547        let string = self.deparse().map_err(ser::Error::custom)?;
548        string.serialize(serializer)
549    }
550}
551
552impl ser::Serialize for Pairlist {
553    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
554    where
555        S: ser::Serializer,
556    {
557        use serde::ser::SerializeMap;
558        let mut s = serializer.serialize_map(Some(self.len()))?;
559        for (k, v) in self.iter() {
560            s.serialize_key(&k)?;
561            s.serialize_value(&v)?;
562        }
563        s.end()
564    }
565}
566
567impl ser::Serialize for Function {
568    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
569    where
570        S: ser::Serializer,
571    {
572        serializer.serialize_unit()
573        // if let (Some(formals), Some(body), Some(environment)) = (
574        //     self.formals(), self.body(), self.environment()
575        // ) {
576        //     use crate as extendr_api;
577        //     list!(formals=formals, body=body, environment=environment).serialize(serializer)
578        // } else {
579        //     serializer.serialize_str("Function")
580        // }
581    }
582}
583
584impl ser::Serialize for Environment {
585    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
586    where
587        S: ser::Serializer,
588    {
589        serializer.serialize_unit()
590    }
591}
592
593impl ser::Serialize for Promise {
594    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
595    where
596        S: ser::Serializer,
597    {
598        serializer.serialize_unit()
599    }
600}
601
602impl ser::Serialize for Language {
603    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
604    where
605        S: ser::Serializer,
606    {
607        serializer.serialize_unit()
608    }
609}
610
611impl ser::Serialize for Integers {
612    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
613    where
614        S: ser::Serializer,
615    {
616        if self.len() == 1 {
617            self.elt(0).serialize(serializer)
618        } else {
619            use serde::ser::SerializeSeq;
620            let mut s = serializer.serialize_seq(Some(self.len()))?;
621            for v in self.iter() {
622                s.serialize_element(&v)?;
623            }
624            s.end()
625        }
626    }
627}
628
629impl ser::Serialize for Logicals {
630    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
631    where
632        S: ser::Serializer,
633    {
634        if self.len() == 1 {
635            self.elt(0).serialize(serializer)
636        } else {
637            use serde::ser::SerializeSeq;
638            let mut s = serializer.serialize_seq(Some(self.len()))?;
639            for v in self.iter() {
640                s.serialize_element(&v)?;
641            }
642            s.end()
643        }
644    }
645}
646
647impl ser::Serialize for List {
648    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
649    where
650        S: ser::Serializer,
651    {
652        if self.has_names() {
653            serializer.collect_map(self.iter())
654        } else {
655            serializer.collect_seq(self.values())
656        }
657    }
658}
659
660impl ser::Serialize for Doubles {
661    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
662    where
663        S: ser::Serializer,
664    {
665        if self.len() == 1 {
666            self.elt(0).serialize(serializer)
667        } else {
668            use serde::ser::SerializeSeq;
669            let mut s = serializer.serialize_seq(Some(self.len()))?;
670            for v in self.iter() {
671                s.serialize_element(&v)?;
672            }
673            s.end()
674        }
675    }
676}
677
678impl ser::Serialize for Rstr {
679    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
680    where
681        S: ser::Serializer,
682    {
683        if self.is_na() {
684            serializer.serialize_unit()
685        } else {
686            serializer.serialize_str(self)
687        }
688    }
689}
690
691impl ser::Serialize for Raw {
692    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
693    where
694        S: ser::Serializer,
695    {
696        let bytes = self
697            .as_robj()
698            .as_raw_slice()
699            .ok_or_else(|| ser::Error::custom("expected a raw vector"))?;
700        serializer.serialize_bytes(bytes)
701    }
702}
703
704impl ser::Serialize for Rint {
705    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
706    where
707        S: ser::Serializer,
708    {
709        if let Some(v) = (*self).into() {
710            serializer.serialize_i32(v)
711        } else {
712            serializer.serialize_unit()
713        }
714    }
715}
716
717impl ser::Serialize for Rfloat {
718    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
719    where
720        S: ser::Serializer,
721    {
722        if let Some(v) = (*self).into() {
723            serializer.serialize_f64(v)
724        } else {
725            serializer.serialize_unit()
726        }
727    }
728}
729
730impl ser::Serialize for Rbool {
731    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
732    where
733        S: ser::Serializer,
734    {
735        if let Some(v) = (*self).into() {
736            serializer.serialize_bool(v)
737        } else {
738            serializer.serialize_unit()
739        }
740    }
741}
742
743impl ser::Serialize for Robj {
744    fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
745    where
746        S: ser::Serializer,
747    {
748        match self.as_any() {
749            Rany::Null(_) => serializer.serialize_unit(),
750            Rany::Symbol(value) => value.serialize(serializer),
751            Rany::Pairlist(value) => value.serialize(serializer),
752            Rany::Function(value) => value.serialize(serializer),
753            Rany::Environment(value) => value.serialize(serializer),
754            Rany::Promise(value) => value.serialize(serializer),
755            Rany::Language(value) => value.serialize(serializer),
756            Rany::Special(value) => value.serialize(serializer),
757            Rany::Builtin(value) => value.serialize(serializer),
758            Rany::Rstr(value) => value.serialize(serializer),
759            Rany::Logicals(value) => value.serialize(serializer),
760            Rany::Integers(value) => value.serialize(serializer),
761            Rany::Doubles(value) => value.serialize(serializer),
762            Rany::Complexes(_complex) => serializer.serialize_unit(),
763            Rany::Strings(value) => value.serialize(serializer),
764            Rany::Dot(_dot) => serializer.serialize_unit(),
765            Rany::Any(_any) => serializer.serialize_unit(),
766            Rany::List(value) => value.serialize(serializer),
767            Rany::Expressions(value) => value.serialize(serializer),
768            Rany::Bytecode(_bytecode) => serializer.serialize_unit(),
769            Rany::ExternalPtr(_externalptr) => serializer.serialize_unit(),
770            Rany::WeakRef(_weakref) => serializer.serialize_unit(),
771            Rany::Raw(value) => value.serialize(serializer),
772            Rany::S4(value) => value.serialize(serializer),
773            Rany::Unknown(_unknown) => serializer.serialize_unit(),
774        }
775    }
776}