pub struct SaveHelper<'a, T>(pub &'a T);
pub struct LoadHelper<'a, T>(pub &'a mut T);
pub trait SnapshotSaveFallback {
fn snapshot_save(&self) -> Result<super::SnapshotData, String>;
}
impl<T> SnapshotSaveFallback for SaveHelper<'_, T> {
fn snapshot_save(&self) -> Result<super::SnapshotData, String> {
Err("snapshot not implemented: agent type does not implement serde::Serialize + serde::de::DeserializeOwned".to_string())
}
}
impl<T: serde::Serialize> SaveHelper<'_, T> {
pub fn snapshot_save(&self) -> Result<super::SnapshotData, String> {
let data = serde_json::to_vec(self.0)
.map_err(|e| format!("Failed to serialize agent snapshot: {}", e))?;
Ok(super::SnapshotData {
data,
mime_type: "application/json".to_string(),
})
}
}
pub trait SnapshotLoadFallback {
fn snapshot_load(&mut self, bytes: &[u8]) -> Result<(), String>;
}
impl<T> SnapshotLoadFallback for LoadHelper<'_, T> {
fn snapshot_load(&mut self, _bytes: &[u8]) -> Result<(), String> {
Err("snapshot not implemented: agent type does not implement serde::Serialize + serde::de::DeserializeOwned".to_string())
}
}
impl<T: serde::de::DeserializeOwned> LoadHelper<'_, T> {
pub fn snapshot_load(&mut self, bytes: &[u8]) -> Result<(), String> {
*self.0 = serde_json::from_slice(bytes)
.map_err(|e| format!("Failed to deserialize agent snapshot: {}", e))?;
Ok(())
}
}