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