diff --git a/src/network/client.rs b/src/network/client.rs index 0ef12c5..2d35e8d 100644 --- a/src/network/client.rs +++ b/src/network/client.rs @@ -21,14 +21,9 @@ use crate::{ }, network_identity::NetworkIdentity, }, + settings::{client_settings::ClientSettings, general_settings::SettingsLike}, }; -#[derive(Clone)] -pub struct ClientSettings { - server_url: SocketAddr, - name: String, -} - pub enum ClientCommands { SendCapture(CapturePath), SendMove { from: Position, to: Position }, @@ -64,10 +59,7 @@ pub struct Client { impl Client { pub async fn new() -> Option { - let settings = ClientSettings { - server_url: SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6767), - name: "Morbius".into(), - }; + let settings = ClientSettings::new(); let (conn_sender, conn_reciever) = mpsc::channel::<(SocketAddr, Message)>(1024); diff --git a/src/settings/client_settings.rs b/src/settings/client_settings.rs new file mode 100644 index 0000000..fcd561f --- /dev/null +++ b/src/settings/client_settings.rs @@ -0,0 +1,26 @@ +use std::net::SocketAddr; + +use serde::{Deserialize, Serialize}; + +use crate::settings::general_settings::{DEFAULT_URL, SettingsLike}; + +#[derive(Clone, Serialize, Deserialize)] +pub struct ClientSettings { + pub server_url: SocketAddr, + pub name: String, +} + +impl Default for ClientSettings { + fn default() -> Self { + Self { + server_url: DEFAULT_URL, + name: "Player".to_string(), + } + } +} + +impl SettingsLike for ClientSettings { + fn get_file_path() -> Result> { + Ok(Self::get_config_dir()?.join("client.toml")) + } +} diff --git a/src/settings/general_settings.rs b/src/settings/general_settings.rs index bda1630..bf6e8a8 100644 --- a/src/settings/general_settings.rs +++ b/src/settings/general_settings.rs @@ -1,9 +1,14 @@ use core::error; -use std::path::PathBuf; +use std::{ + net::{IpAddr, Ipv4Addr, SocketAddr}, + path::PathBuf, +}; use log::warn; use serde::{Serialize, de::DeserializeOwned}; +pub const DEFAULT_URL: SocketAddr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 6767); + // maybe consider some better name for this pub trait SettingsLike: Serialize + DeserializeOwned + Default { fn get_config_dir() -> Result> { @@ -31,6 +36,8 @@ pub trait SettingsLike: Serialize + DeserializeOwned + Default { Ok(toml::from_slice(&std::fs::read(Self::get_file_path()?)?)?) // i love rust } + /// Try to create new instance of `Self` with values from config file. If there is no content + /// defaults to Self::default. If config file is invalid overwrites it with default values fn new() -> Self { match Self::read_from_file() { Ok(settings) => return settings, diff --git a/src/settings/mod.rs b/src/settings/mod.rs index e1c42a7..39e8a87 100644 --- a/src/settings/mod.rs +++ b/src/settings/mod.rs @@ -1,2 +1,3 @@ +pub mod client_settings; pub mod general_settings; pub mod server_settings; diff --git a/src/settings/server_settings.rs b/src/settings/server_settings.rs index 1a84670..a065ce1 100644 --- a/src/settings/server_settings.rs +++ b/src/settings/server_settings.rs @@ -5,7 +5,7 @@ use std::{ use serde::{Deserialize, Serialize}; -use crate::settings::general_settings::SettingsLike; +use crate::settings::general_settings::{DEFAULT_URL, SettingsLike}; // TODO! More settings! #[derive(Serialize, Deserialize)] @@ -15,19 +15,19 @@ pub struct ServerSettings { pub allow_spectators: bool, } -impl SettingsLike for ServerSettings { - fn get_file_path() -> Result> { - 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), + addr: DEFAULT_URL, 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, } } } + +impl SettingsLike for ServerSettings { + fn get_file_path() -> Result> { + Ok(Self::get_config_dir()?.join("server.toml")) + } +}