1use 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
62pub 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 type Ok = ();
112
113 type Error = Error;
115
116 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 fn serialize_bool(self, v: bool) -> Result<()> {
130 self.robj = Some(Robj::from(v));
131 Ok(())
132 }
133
134 fn serialize_i8(self, v: i8) -> Result<()> {
136 self.robj = Some(Robj::from(v));
137 Ok(())
138 }
139
140 fn serialize_i16(self, v: i16) -> Result<()> {
142 self.robj = Some(Robj::from(v));
143 Ok(())
144 }
145
146 fn serialize_i32(self, v: i32) -> Result<()> {
148 self.robj = Some(Robj::from(v));
149 Ok(())
150 }
151
152 fn serialize_i64(self, v: i64) -> Result<()> {
154 self.robj = Some(Robj::from(v));
155 Ok(())
156 }
157
158 fn serialize_u8(self, v: u8) -> Result<()> {
160 self.robj = Some(Robj::from(v));
161 Ok(())
162 }
163
164 fn serialize_u16(self, v: u16) -> Result<()> {
166 self.robj = Some(Robj::from(v));
167 Ok(())
168 }
169
170 fn serialize_u32(self, v: u32) -> Result<()> {
172 self.robj = Some(Robj::from(v));
173 Ok(())
174 }
175
176 fn serialize_u64(self, v: u64) -> Result<()> {
178 self.robj = Some(Robj::from(v));
179 Ok(())
180 }
181
182 fn serialize_f32(self, v: f32) -> Result<()> {
184 self.robj = Some(Robj::from(v));
185 Ok(())
186 }
187
188 fn serialize_f64(self, v: f64) -> Result<()> {
190 self.robj = Some(Robj::from(v));
191 Ok(())
192 }
193
194 fn serialize_char(self, v: char) -> Result<()> {
196 self.robj = Some(Robj::from(v.to_string()));
197 Ok(())
198 }
199
200 fn serialize_str(self, v: &str) -> Result<()> {
202 self.robj = Some(Robj::from(v));
203 Ok(())
204 }
205
206 fn serialize_bytes(self, v: &[u8]) -> Result<()> {
208 self.robj = Some(Robj::from(v));
209 Ok(())
210 }
211
212 fn serialize_none(self) -> Result<()> {
214 self.robj = Some(Robj::null());
215 Ok(())
216 }
217
218 fn serialize_some<T>(self, value: &T) -> Result<()>
220 where
221 T: ?Sized + Serialize,
222 {
223 value.serialize(self)
224 }
225
226 fn serialize_unit(self) -> Result<()> {
229 self.robj = Some(Robj::null());
230 Ok(())
231 }
232
233 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
237 self.serialize_unit()
238 }
239
240 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 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 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 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 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 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 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 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 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 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
357impl<'a> ser::SerializeSeq for self::SerializeSeq<'a> {
359 type Ok = ();
361 type Error = Error;
363
364 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 fn end(self) -> Result<()> {
375 self.parent.robj = Some(List::from_values(self.values).into());
376 Ok(())
377 }
378}
379
380impl<'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
399impl<'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
418impl<'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
439impl<'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
472impl<'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
492impl<'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 }
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}