use serde::{Deserialize, Serialize};
use std::fs;
use std::error::Error;
#[derive(Debug, Deserialize, Serialize)]
pub struct GameConfig {
#[serde(default)]
pub name: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub author: String,
}
impl Default for GameConfig {
fn default() -> Self {
Self {
name: "Untitled Game".into(),
description: "No description provided".into(),
author: "Unknown Author".into(),
}
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct AssetsConfig {
#[serde(default)]
pub sb3: String,
}
impl Default for AssetsConfig {
fn default() -> Self {
Self {
sb3: "project.sb3".into()
}
}
}
#[derive(Debug, Deserialize, Serialize)]
pub struct ProjectConfig {
#[serde(default)]
pub game: GameConfig,
#[serde(default)]
pub assets: AssetsConfig,
}
impl Default for ProjectConfig {
fn default() -> Self {
Self {
game: GameConfig::default(),
assets: AssetsConfig::default(),
}
}
}
impl ProjectConfig {
pub fn load(path: &str) -> Result<Self, Box<dyn Error>> {
let content = fs::read_to_string(path)?;
let mut config: ProjectConfig = toml::from_str(&content)?;
let defaults = ProjectConfig::default();
if config.game.name.is_empty() {
config.game.name = defaults.game.name;
}
if config.game.description.is_empty() {
config.game.description = defaults.game.description;
}
if config.game.author.is_empty() {
config.game.author = defaults.game.author;
}
if config.assets.sb3.is_empty() {
config.assets.sb3 = defaults.assets.sb3;
}
Ok(config)
}
}