use std::net::SocketAddr; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize, JsonSchema, Debug, Clone)] pub struct ServerProperties { #[serde(default = "default_name")] pub name: String, #[serde(default = "default_addr")] pub addr: SocketAddr, #[serde(default = "default_logger")] pub logger: String, #[serde(alias = "$schema", default = "default_schema")] schema: String, } impl ServerProperties { pub fn load() -> Self { serde_json::from_str(&match std::fs::read_to_string("properties.json") { Ok(v) => v, Err(e) => { println!("properties.json parsing error: {}", e); std::process::exit(1) } }) .unwrap() } } impl Default for ServerProperties { fn default() -> Self { Self { name: default_name(), addr: default_addr(), logger: default_logger(), schema: default_schema(), } } } fn default_logger() -> String { "barebones".into() } fn default_addr() -> SocketAddr { "0.0.0.0:50052".parse().unwrap() } fn default_name() -> String { "Spah's sappin' mah sentreh".into() } fn default_schema() -> String { "https://theperkinrex.duckdns.org/CardsSimulator/cards-simulator/raw/branch/main/server/schema/server-properties.json".into() } pub fn setup() { if cfg!(debug_assertions) { if let Ok(e) = std::env::var("CARGO_MANIFEST_DIR") { std::fs::write( AsRef::::as_ref(&e) .join("schema") .join("server-properties.json"), serde_json::to_string_pretty(&schemars::schema_for!(ServerProperties)).unwrap(), ) .unwrap() } } if !std::path::PathBuf::from("properties.json").exists() { std::fs::write( "properties.json", serde_json::to_string_pretty(&ServerProperties::default()).unwrap(), ) .unwrap(); } if !std::path::PathBuf::from("games").exists() { std::fs::create_dir("games").unwrap(); } }