From ec94d0445e13375274428195549701838199e5cd Mon Sep 17 00:00:00 2001 From: Sebastian Lohff Date: Thu, 30 Dec 2021 23:56:43 +0100 Subject: [PATCH] Add config to chatserver Options can be overridden via cli --- Cargo.lock | 62 +++++++++++++++++++++++++++++++++++++++++++++++------ Cargo.toml | 2 ++ src/main.rs | 46 +++++++++++++++++++++++++++++---------- 3 files changed, 92 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 43a6a55..12bc587 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -114,6 +114,12 @@ version = "0.2.112" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +[[package]] +name = "linked-hash-map" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" + [[package]] name = "memchr" version = "2.4.1" @@ -190,19 +196,52 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "retain_mut" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11000e6ba5020e53e7cc26f73b91ae7d5496b4977851479edb66b694c0675c21" - [[package]] name = "rustchat" version = "0.1.0" dependencies = [ "chrono", "clap", - "retain_mut", + "serde", + "serde_yaml", +] + +[[package]] +name = "ryu" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" + +[[package]] +name = "serde" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9875c23cf305cd1fd7eb77234cbb705f21ea6a72c637a5c6db5fe4b8e7f008" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc0db5cb2556c0e558887d9bbdcf6ac4471e83ff66cf696e5419024d1606276" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", ] [[package]] @@ -302,3 +341,12 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/Cargo.toml b/Cargo.toml index c311b27..2564d33 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,5 @@ edition = "2021" [dependencies] clap = { version = "3.0.0-rc.9", features = ["derive"] } chrono = "0.4" +serde = { version = "1.0", features = ["derive"]} +serde_yaml = "0.8" diff --git a/src/main.rs b/src/main.rs index 9a44d75..93bedd0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,10 +5,9 @@ use clap::Parser; use std::io::Write; use std::io::{self, BufRead}; use chrono::{DateTime, Utc}; -//use std::borrow::{Borrow, BorrowMut}; -//use retain_mut::RetainMut; use std::collections::BTreeMap; - +use serde::{Serialize, Deserialize}; +use std::fs::File; /// Represent one single chat user and their network stuff @@ -30,13 +29,14 @@ impl ChatUser { } struct ChatServer { + config: ConfigArgs, user_map: BTreeMap, user_id_counter: u64, } impl ChatServer { - pub fn new() -> Self { - Self{user_map: BTreeMap::new(), user_id_counter: 1} + pub fn new(config: ConfigArgs) -> Self { + Self{config, user_map: BTreeMap::new(), user_id_counter: 1} } pub fn get_user_count(&self) -> usize { @@ -156,22 +156,46 @@ fn run_thread(stream: TcpStream, server: Arc>) { #[derive(Parser, Debug)] #[clap(about, version, author)] struct Args { + /// Path to config file + #[clap(short, long, default_value = "config.yaml")] + config: String, + /// IP address to bind to - #[clap(long, default_value = "0.0.0.0")] - host: String, + #[clap(long)] + host: Option, /// Port to run the server on - #[clap(short, long, default_value_t = 1337)] - port: i16, + #[clap(short, long)] + port: Option, +} + + +#[derive(Debug, Serialize, Deserialize)] +struct ConfigArgs { + host: String, + port: u16, + greeting_msg: String, } fn main() -> std::io::Result<()> { + // argument parsing let args = Args::parse(); - let binding_host = format!("{}:{}", args.host, args.port); + + // read config file + let config_reader = File::open(args.config).expect("Could not open config file"); + let mut config: ConfigArgs = serde_yaml::from_reader(&config_reader).expect("Could not parse config file"); + + if let Some(host) = args.host { + config.host = host; + } + if let Some(port) = args.port { + config.port = port; + } + let binding_host = format!("{}:{}", config.host, config.port); println!("Binding to {}", binding_host); let listener = TcpListener::bind(binding_host)?; - let server = Arc::new(Mutex::new(ChatServer::new())); + let server = Arc::new(Mutex::new(ChatServer::new(config))); // accept connections and process them serially for stream in listener.incoming() {