use crate::event::Event;
use crate::storage::save_data::SaveMetadata;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SaveGameRequested {
pub slot: String,
pub label: Option<String>,
}
impl Event for SaveGameRequested {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoadGameRequested {
pub slot: String,
}
impl Event for LoadGameRequested {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeleteSaveRequested {
pub slot: String,
}
impl Event for DeleteSaveRequested {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListSavesRequested;
impl Event for ListSavesRequested {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetSaveMetadataRequested {
pub slot: String,
}
impl Event for GetSaveMetadataRequested {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutoSaveRequested {
pub reason: Option<String>,
}
impl Event for AutoSaveRequested {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GameSaved {
pub slot: String,
pub metadata: SaveMetadata,
pub label: Option<String>,
}
impl Event for GameSaved {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GameLoaded {
pub slot: String,
pub metadata: SaveMetadata,
}
impl Event for GameLoaded {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SaveDeleted {
pub slot: String,
}
impl Event for SaveDeleted {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SavesListed {
pub saves: Vec<SaveMetadata>,
}
impl Event for SavesListed {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SaveMetadataRetrieved {
pub slot: String,
pub metadata: SaveMetadata,
}
impl Event for SaveMetadataRetrieved {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutoSaveCompleted {
pub slot: String,
pub metadata: SaveMetadata,
pub reason: Option<String>,
}
impl Event for AutoSaveCompleted {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SaveLoadFailed {
pub operation: String,
pub slot: Option<String>,
pub error: String,
}
impl Event for SaveLoadFailed {}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_save_game_requested() {
let event = SaveGameRequested {
slot: "player_save_1".to_string(),
label: Some("Chapter 3 Complete".to_string()),
};
assert_eq!(event.slot, "player_save_1");
assert_eq!(event.label, Some("Chapter 3 Complete".to_string()));
}
#[test]
fn test_load_game_requested() {
let event = LoadGameRequested {
slot: "player_save_1".to_string(),
};
assert_eq!(event.slot, "player_save_1");
}
#[test]
fn test_auto_save_requested() {
let event = AutoSaveRequested {
reason: Some("checkpoint".to_string()),
};
assert_eq!(event.reason, Some("checkpoint".to_string()));
}
#[test]
fn test_game_saved() {
let metadata = SaveMetadata {
version: 1,
slot: "test_slot".to_string(),
timestamp: std::time::SystemTime::now(),
size_bytes: 1024,
};
let event = GameSaved {
slot: "test_slot".to_string(),
metadata: metadata.clone(),
label: None,
};
assert_eq!(event.slot, "test_slot");
assert_eq!(event.metadata.slot, metadata.slot);
}
#[test]
fn test_save_load_failed() {
let event = SaveLoadFailed {
operation: "save".to_string(),
slot: Some("test_slot".to_string()),
error: "Disk full".to_string(),
};
assert_eq!(event.operation, "save");
assert_eq!(event.slot, Some("test_slot".to_string()));
assert_eq!(event.error, "Disk full");
}
}