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 Ok(serializer.robj.unwrap())
100}
101
102impl<'a> ser::Serializer for &'a mut RobjSerializer {
103 type Ok = ();
110
111 type Error = Error;
113
114 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 fn serialize_bool(self, v: bool) -> Result<()> {
128 self.robj = Some(Robj::from(v));
129 Ok(())
130 }
131
132 fn serialize_i8(self, v: i8) -> Result<()> {
134 self.robj = Some(Robj::from(v));
135 Ok(())
136 }
137
138 fn serialize_i16(self, v: i16) -> Result<()> {
140 self.robj = Some(Robj::from(v));
141 Ok(())
142 }
143
144 fn serialize_i32(self, v: i32) -> Result<()> {
146 self.robj = Some(Robj::from(v));
147 Ok(())
148 }
149
150 fn serialize_i64(self, v: i64) -> Result<()> {
152 self.robj = Some(Robj::from(v));
153 Ok(())
154 }
155
156 fn serialize_u8(self, v: u8) -> Result<()> {
158 self.robj = Some(Robj::from(v));
159 Ok(())
160 }
161
162 fn serialize_u16(self, v: u16) -> Result<()> {
164 self.robj = Some(Robj::from(v));
165 Ok(())
166 }
167
168 fn serialize_u32(self, v: u32) -> Result<()> {
170 self.robj = Some(Robj::from(v));
171 Ok(())
172 }
173
174 fn serialize_u64(self, v: u64) -> Result<()> {
176 self.robj = Some(Robj::from(v));
177 Ok(())
178 }
179
180 fn serialize_f32(self, v: f32) -> Result<()> {
182 self.robj = Some(Robj::from(v));
183 Ok(())
184 }
185
186 fn serialize_f64(self, v: f64) -> Result<()> {
188 self.robj = Some(Robj::from(v));
189 Ok(())
190 }
191
192 fn serialize_char(self, v: char) -> Result<()> {
194 self.robj = Some(Robj::from(v.to_string()));
195 Ok(())
196 }
197
198 fn serialize_str(self, v: &str) -> Result<()> {
200 self.robj = Some(Robj::from(v));
201 Ok(())
202 }
203
204 fn serialize_bytes(self, v: &[u8]) -> Result<()> {
206 self.robj = Some(Robj::from(v));
207 Ok(())
208 }
209
210 fn serialize_none(self) -> Result<()> {
212 self.robj = Some(Robj::from(()));
213 Ok(())
214 }
215
216 fn serialize_some<T>(self, value: &T) -> Result<()>
218 where
219 T: ?Sized + Serialize,
220 {
221 value.serialize(self)
222 }
223
224 fn serialize_unit(self) -> Result<()> {
227 self.robj = Some(Robj::from(()));
228 Ok(())
229 }
230
231 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
235 self.serialize_unit()
236 }
237
238 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 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 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 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 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 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 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 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 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 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
355impl<'a> ser::SerializeSeq for self::SerializeSeq<'a> {
357 type Ok = ();
359 type Error = Error;
361
362 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 fn end(self) -> Result<()> {
373 self.parent.robj = Some(List::from_values(self.values).into());
374 Ok(())
375 }
376}
377
378impl<'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
397impl<'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
416impl<'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
437impl<'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
470impl<'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
490impl<'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 }
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}