use crate::context::ResourceContext;
use crate::storage::save_data::{SaveData, SaveMetadata};
use async_trait::async_trait;
#[async_trait]
pub trait SaveLoadHook: Send + Sync {
async fn before_save(
&self,
_save_data: &mut SaveData,
_resources: &mut ResourceContext,
) -> bool {
true }
async fn after_save(
&self,
_save_data: &SaveData,
_metadata: &SaveMetadata,
_resources: &mut ResourceContext,
) {
}
async fn before_load(
&self,
_slot: &str,
_metadata: &SaveMetadata,
_resources: &mut ResourceContext,
) -> bool {
true }
async fn after_load(&self, _save_data: &SaveData, _resources: &mut ResourceContext) {
}
async fn on_save_failed(&self, _slot: &str, _error: &str, _resources: &mut ResourceContext) {
}
async fn on_load_failed(&self, _slot: &str, _error: &str, _resources: &mut ResourceContext) {
}
async fn on_auto_save(
&self,
reason: Option<&str>,
_resources: &ResourceContext,
) -> Option<String> {
let timestamp = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs();
match reason {
Some(r) => Some(format!("auto_{}_{}", r, timestamp)),
None => Some(format!("auto_{}", timestamp)),
}
}
}
pub struct DefaultSaveLoadHook;
#[async_trait]
impl SaveLoadHook for DefaultSaveLoadHook {}
#[cfg(test)]
mod tests {
use super::*;
use crate::storage::save_data::{SaveData, SaveMetadata};
use std::time::SystemTime;
#[tokio::test]
async fn test_default_hook_allows_operations() {
let hook = DefaultSaveLoadHook;
let mut resources = ResourceContext::new();
let mut save_data = SaveData::new("test", serde_json::Value::Null);
assert!(hook.before_save(&mut save_data, &mut resources).await);
let metadata = SaveMetadata {
version: 1,
slot: "test".to_string(),
timestamp: SystemTime::now(),
size_bytes: 100,
};
hook.after_save(&save_data, &metadata, &mut resources).await;
assert!(hook.before_load("test", &metadata, &mut resources).await);
hook.after_load(&save_data, &mut resources).await;
hook.on_save_failed("test", "error", &mut resources).await;
hook.on_load_failed("test", "error", &mut resources).await;
let auto_slot = hook.on_auto_save(Some("checkpoint"), &resources).await;
assert!(auto_slot.is_some());
assert!(auto_slot.unwrap().contains("auto_checkpoint"));
}
}