use bevy::prelude::*;
use serde::{Deserialize, Serialize};
pub use moonshine_save::prelude::{Save, Unload};
#[derive(Component, Clone, Debug, Reflect, Serialize, Deserialize)]
#[reflect(Component)]
pub struct SaveMetadata {
pub slot_name: String,
pub timestamp: u64,
pub version: String,
pub game_day: u32,
pub custom: String,
}
impl SaveMetadata {
pub fn new(slot_name: impl Into<String>) -> Self {
Self {
slot_name: slot_name.into(),
timestamp: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs(),
version: env!("CARGO_PKG_VERSION").to_string(),
game_day: 0,
custom: String::new(),
}
}
pub fn with_game_day(mut self, game_day: u32) -> Self {
self.game_day = game_day;
self
}
pub fn with_custom(mut self, custom: impl Into<String>) -> Self {
self.custom = custom.into();
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_save_metadata_creation() {
let metadata = SaveMetadata::new("slot_1");
assert_eq!(metadata.slot_name, "slot_1");
assert_eq!(metadata.version, env!("CARGO_PKG_VERSION"));
assert!(metadata.timestamp > 0);
}
#[test]
fn test_save_metadata_builder() {
let metadata = SaveMetadata::new("slot_1")
.with_game_day(42)
.with_custom(r#"{"player": "Hero"}"#);
assert_eq!(metadata.game_day, 42);
assert_eq!(metadata.custom, r#"{"player": "Hero"}"#);
}
}