use crate::{handles::OwnedHandle, Deserializer, NonTrivialObject, Object, Serializer};
use std::fmt;
use std::io::Result;
pub struct Delayed<T: Object> {
inner: DelayedInner<T>,
}
enum DelayedInner<T: Object> {
Serialized(Vec<u8>, Vec<OwnedHandle>),
Deserialized(T),
}
impl<T: Object> Delayed<T> {
pub fn new(value: T) -> Self {
Self {
inner: DelayedInner::Deserialized(value),
}
}
pub fn deserialize(self) -> Result<T> {
match self.inner {
DelayedInner::Serialized(data, handles) => unsafe {
Deserializer::new(data, handles).deserialize()
},
DelayedInner::Deserialized(_) => {
panic!("Cannot deserialize a deserialized Delayed value")
}
}
}
}
impl<T: Object> fmt::Debug for Delayed<T> {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.debug_struct("Delayed").finish()
}
}
unsafe impl<T: Object> NonTrivialObject for Delayed<T> {
fn serialize_self_non_trivial(&self, s: &mut Serializer) {
match self.inner {
DelayedInner::Serialized(_, _) => panic!("Cannot serialize a serialized Delayed value"),
DelayedInner::Deserialized(ref value) => {
let mut s1 = Serializer::new();
s1.serialize(value);
let handles = s1
.drain_handles()
.into_iter()
.map(|handle| s.add_handle(handle))
.collect::<Vec<usize>>();
s.serialize(&handles);
s.serialize(&s1.into_vec());
}
}
}
unsafe fn deserialize_self_non_trivial(d: &mut Deserializer) -> Result<Self> {
let handles = d
.deserialize::<Vec<usize>>()?
.into_iter()
.map(|handle| d.drain_handle(handle))
.collect();
Ok(Delayed {
inner: DelayedInner::Serialized(d.deserialize()?, handles),
})
}
}