Files
desktop_dungeon_generator/src/saveandload.rs
T

62 lines
1.7 KiB
Rust
Raw Normal View History

2026-04-20 10:23:49 -05:00
use rfd::FileDialog;
use serde::{Deserialize, Serialize};
use std::fs;
use std::path::PathBuf;
/*
* Persistence logic for dungeon state.
* Handles saving and loading the complete dungeon state
* (settings and layout data) to and from disk using JSON.
*/
2026-04-20 10:23:49 -05:00
use crate::layout::DungeonLayout;
use crate::ui::UiSettings;
#[derive(Serialize, Deserialize)]
pub struct DungeonSave {
pub settings: UiSettings,
pub layouts: Vec<DungeonLayout>,
pub svgs: Vec<String>,
2026-04-20 10:23:49 -05:00
}
pub fn save_dungeon(
settings: &UiSettings,
layouts: Vec<DungeonLayout>,
svgs: Vec<String>,
2026-04-20 10:23:49 -05:00
) -> Result<PathBuf, String> {
let path = FileDialog::new()
.set_title("Save Dungeon State")
.add_filter("Dungeon File", &["dungeon"])
.set_file_name("my_dungeon.dungeon")
.save_file()
.ok_or_else(|| "Save canceled".to_string())?;
let save_data = DungeonSave {
settings: settings.clone(),
layouts,
svgs,
2026-04-20 10:23:49 -05:00
};
let json = serde_json::to_string_pretty(&save_data)
.map_err(|e| format!("Failed to serialize dungeon: {e}"))?;
fs::write(&path, json).map_err(|e| format!("Failed to write file: {e}"))?;
Ok(path)
}
pub fn load_dungeon() -> Result<DungeonSave, String> {
let path = FileDialog::new()
.set_title("Load Dungeon State")
.add_filter("Dungeon File", &["dungeon"])
.pick_file()
.ok_or_else(|| "Load canceled".to_string())?;
let content = fs::read_to_string(path).map_err(|e| format!("Failed to read file: {e}"))?;
let save_data: DungeonSave =
serde_json::from_str(&content).map_err(|e| format!("Failed to parse dungeon file: {e}"))?;
Ok(save_data)
}