Skip to content

Commit 12da707

Browse files
committed
impl Serialize for Gc, GcArray, GcString
1 parent 3140b05 commit 12da707

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

src/serde.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
use std::marker::PhantomData;
1313

1414
use crate::array::{GcArray, GcString};
15-
use serde::de::{self, Deserializer, DeserializeSeed};
15+
use serde::{Serialize, de::{self, Deserializer, DeserializeSeed}, ser::SerializeSeq};
1616

1717
use crate::prelude::*;
1818

@@ -66,6 +66,34 @@ impl<'gc, 'de, Id: CollectorId> GcDeserialize<'gc, 'de, Id> for GcString<'gc, Id
6666
}
6767
}
6868

69+
impl<'gc, T: Serialize, Id: CollectorId> Serialize for Gc<'gc, T, Id> {
70+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
71+
S: serde::Serializer {
72+
self.value().serialize(serializer)
73+
}
74+
}
75+
76+
77+
impl<'gc, T: Serialize, Id: CollectorId> Serialize for GcArray<'gc, T, Id> {
78+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
79+
S: serde::Serializer {
80+
let mut seq = serializer.serialize_seq(Some(self.len()))?;
81+
for val in self.as_slice().iter() {
82+
seq.serialize_element(val)?;
83+
}
84+
seq.end()
85+
}
86+
}
87+
88+
89+
impl<'gc, Id: CollectorId> Serialize for GcString<'gc, Id> {
90+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
91+
S: serde::Serializer {
92+
serializer.serialize_str(self.as_str())
93+
}
94+
}
95+
96+
6997
/// Implement [GcDeserialize] for a type by delegating to its [serde::Deserialize] implementation.
7098
///
7199
/// This should only be used for types that can never have gc pointers inside of them (or if you don't care to support that).

0 commit comments

Comments
 (0)