use serde::{Deserialize, Serialize};
use std::fs;
use std::path::Path;
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct InstanceConfig {
#[serde(default)]
pub model_id_v1: Option<crate::config::sys::SystemMeta>,
#[serde(default)]
pub depart_id_v1: Option<crate::config::sys::SystemMeta>,
#[serde(default)]
pub shard_id_v1: Option<crate::config::sys::SystemMeta>,
pub zone_id: String,
pub world_offset: Coordinate,
pub dimensions: Dimensions,
pub neighbors: Neighbors,
pub settings: ShardSettings,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
pub struct ShardSettings {
#[serde(default = "default_checkpoints")]
pub save_checkpoints_interval_ticks: u32,
#[serde(default = "default_night_interval")]
pub night_interval_ticks: u64,
#[serde(default = "default_prune")]
pub prune_threshold: i16,
#[serde(default = "default_max_sprouts")]
pub max_sprouts: u16,
#[serde(default)]
pub ghost_capacity: u32,
}
fn default_checkpoints() -> u32 {
100_000
}
fn default_night_interval() -> u64 {
10_000
} fn default_prune() -> i16 {
15
}
fn default_max_sprouts() -> u16 {
4
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct Coordinate {
pub x: u32,
pub y: u32,
pub z: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct Dimensions {
pub w: u32,
pub d: u32,
pub h: u32,
}
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct Neighbors {
pub x_plus: Option<String>,
pub x_minus: Option<String>,
pub y_plus: Option<String>,
pub y_minus: Option<String>,
pub z_plus: Option<String>, pub z_minus: Option<String>, }
impl InstanceConfig {
pub fn parse(src: &str) -> Result<Self, toml::de::Error> {
toml::from_str(src)
}
pub fn load(path: &Path) -> Result<Self, String> {
let content = fs::read_to_string(path)
.map_err(|e| format!("Failed to read InstanceConfig at {:?}: {}", path, e))?;
Self::parse(&content)
.map_err(|e| format!("Failed to parse TOML InstanceConfig from {:?}: {}", path, e))
}
}
#[cfg(test)]
#[path = "test_instance.rs"]
mod test_instance;