mirror of
https://github.com/szymon-jozef/checkers.git
synced 2026-10-27 19:20:44 +01:00
feat: add saving and reading server setting from config file
This commit is contained in:
118
Cargo.lock
generated
118
Cargo.lock
generated
@@ -127,12 +127,14 @@ dependencies = [
|
||||
name = "checkers"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"dirs",
|
||||
"env_logger",
|
||||
"log",
|
||||
"postcard",
|
||||
"rand",
|
||||
"serde",
|
||||
"tokio",
|
||||
"toml",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
@@ -197,6 +199,27 @@ dependencies = [
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dirs"
|
||||
version = "6.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e"
|
||||
dependencies = [
|
||||
"dirs-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "dirs-sys"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"option-ext",
|
||||
"redox_users",
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "embedded-io"
|
||||
version = "0.4.0"
|
||||
@@ -278,6 +301,17 @@ dependencies = [
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"wasi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
@@ -425,6 +459,15 @@ version = "0.2.189"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
version = "0.1.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28d0a00925a9f930d679b6789b721e3a7f9ed110f41b86d2497caa780c3a070a"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.14"
|
||||
@@ -469,6 +512,12 @@ version = "1.70.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
|
||||
|
||||
[[package]]
|
||||
name = "option-ext"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.5"
|
||||
@@ -567,7 +616,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom",
|
||||
"getrandom 0.4.2",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -586,6 +635,17 @@ dependencies = [
|
||||
"bitflags 2.13.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_users"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac"
|
||||
dependencies = [
|
||||
"getrandom 0.2.17",
|
||||
"libredox",
|
||||
"thiserror",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.13.1"
|
||||
@@ -685,6 +745,15 @@ dependencies = [
|
||||
"zmij",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.8"
|
||||
@@ -802,6 +871,45 @@ dependencies = [
|
||||
"syn 3.0.3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "1.1.4+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3aace63f4bbcdfc2c965b059de67119c89c4017a70d633be6c104910f67056f5"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"serde_core",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_parser",
|
||||
"toml_writer",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "1.1.1+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_parser"
|
||||
version = "1.1.3+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56"
|
||||
dependencies = [
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_writer"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.24"
|
||||
@@ -826,7 +934,7 @@ version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"getrandom 0.4.2",
|
||||
"js-sys",
|
||||
"serde_core",
|
||||
"wasm-bindgen",
|
||||
@@ -950,6 +1058,12 @@ dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
|
||||
@@ -10,12 +10,14 @@ authors = [ "szymon-jozef" ]
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
dirs = "6.0.0"
|
||||
env_logger = "0.11.11"
|
||||
log = "0.4.33"
|
||||
postcard = { version = "1.1.3", features = ["alloc"] }
|
||||
rand = "0.10.2"
|
||||
serde = { version = "1.0.229", features = ["derive"] }
|
||||
tokio = { version = "1.53.1", features = ["full"] }
|
||||
toml = "1.1.4"
|
||||
|
||||
[dependencies.uuid]
|
||||
version = "1.24.0"
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
pub mod logic;
|
||||
pub mod network;
|
||||
pub mod settings;
|
||||
|
||||
@@ -23,15 +23,9 @@ use crate::{
|
||||
},
|
||||
network_identity::NetworkServerIdentity,
|
||||
},
|
||||
settings::{general_settings::SettingsLike, server_settings::ServerSettings},
|
||||
};
|
||||
|
||||
// TODO! More settings!
|
||||
pub struct ServerSettings {
|
||||
pub addr: SocketAddr,
|
||||
pub max_connections: usize,
|
||||
pub allow_spectators: bool,
|
||||
}
|
||||
|
||||
#[derive(PartialEq)]
|
||||
enum ServerStage {
|
||||
Lobby,
|
||||
@@ -71,11 +65,7 @@ pub struct Server {
|
||||
impl Server {
|
||||
pub async fn new() -> Server {
|
||||
// TODO! Should be read from a file
|
||||
let settings = ServerSettings {
|
||||
addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6767),
|
||||
max_connections: 2,
|
||||
allow_spectators: false,
|
||||
};
|
||||
let settings = ServerSettings::new();
|
||||
|
||||
let (sender, reciever) =
|
||||
tokio::sync::mpsc::channel::<(SocketAddr, Message<ClientMessage>)>(1024); // random
|
||||
|
||||
48
src/settings/general_settings.rs
Normal file
48
src/settings/general_settings.rs
Normal file
@@ -0,0 +1,48 @@
|
||||
use core::error;
|
||||
use std::path::PathBuf;
|
||||
|
||||
use log::warn;
|
||||
use serde::{Serialize, de::DeserializeOwned};
|
||||
|
||||
// maybe consider some better name for this
|
||||
pub trait SettingsLike: Serialize + DeserializeOwned + Default {
|
||||
fn get_config_dir() -> Result<PathBuf, Box<dyn error::Error>> {
|
||||
Ok(dirs::config_local_dir()
|
||||
.ok_or("Couldn't get config dir!")?
|
||||
.join("checkers"))
|
||||
}
|
||||
|
||||
fn get_file_path() -> Result<PathBuf, Box<dyn error::Error>>;
|
||||
|
||||
fn save_to_file(&self) -> Result<(), Box<dyn error::Error>> {
|
||||
let path: PathBuf = Self::get_file_path()?;
|
||||
|
||||
if let Some(parent_dir) = path.parent() {
|
||||
std::fs::create_dir_all(parent_dir)?;
|
||||
}
|
||||
|
||||
let toml = toml::to_string(&self)?;
|
||||
std::fs::write(path, toml)?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn read_from_file() -> Result<Self, Box<dyn error::Error>> {
|
||||
Ok(toml::from_slice(&std::fs::read(Self::get_file_path()?)?)?) // i love rust
|
||||
}
|
||||
|
||||
fn new() -> Self {
|
||||
match Self::read_from_file() {
|
||||
Ok(settings) => return settings,
|
||||
Err(e) => warn!("Could not load settings from file, because: {}", e),
|
||||
}
|
||||
|
||||
let settings = Self::default();
|
||||
|
||||
if let Err(e) = settings.save_to_file() {
|
||||
warn!("Could not save server settings to the file, because: {}", e);
|
||||
}
|
||||
|
||||
settings
|
||||
}
|
||||
}
|
||||
2
src/settings/mod.rs
Normal file
2
src/settings/mod.rs
Normal file
@@ -0,0 +1,2 @@
|
||||
pub mod general_settings;
|
||||
pub mod server_settings;
|
||||
33
src/settings/server_settings.rs
Normal file
33
src/settings/server_settings.rs
Normal file
@@ -0,0 +1,33 @@
|
||||
use std::{
|
||||
net::{IpAddr, Ipv4Addr, SocketAddr},
|
||||
path::PathBuf,
|
||||
};
|
||||
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::settings::general_settings::SettingsLike;
|
||||
|
||||
// TODO! More settings!
|
||||
#[derive(Serialize, Deserialize)]
|
||||
pub struct ServerSettings {
|
||||
pub addr: SocketAddr,
|
||||
pub max_connections: usize,
|
||||
pub allow_spectators: bool,
|
||||
}
|
||||
|
||||
impl SettingsLike for ServerSettings {
|
||||
fn get_file_path() -> Result<PathBuf, Box<dyn std::error::Error>> {
|
||||
Ok(Self::get_config_dir()?.join("server.toml"))
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for ServerSettings {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
addr: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6767),
|
||||
max_connections: 2, // Maybe this should be a const somewhere in the server code? It
|
||||
// makes no sense to have different value than this
|
||||
allow_spectators: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user