1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
use toml; use std::fs::File; use std::io::prelude::*; use std::net::SocketAddr; #[derive(Deserialize, Clone, Debug)] #[serde(deny_unknown_fields)] pub struct ServerConfig { pub interface_and_port: SocketAddr, pub max_ping_ms: u64 } #[derive(Deserialize, Clone, Debug)] #[serde(deny_unknown_fields)] pub struct GrabberConfig { pub servers: Vec<SocketAddr>, pub max_ping_ms: u64, pub mouse_interval_ms: u64, pub keyboard_and_clicks_interval_ms: u64 } #[derive(Deserialize, Clone, Debug)] #[serde(deny_unknown_fields)] pub struct SecurityConfig { pub password: String } macro_rules! generate_loader { ($struct:tt) => { impl $struct { pub fn load() -> $struct { let filename = stringify!($struct).to_string() + ".toml"; let filename = &filename; let mut file = File::open(filename).unwrap_or_else(|_| panic!("File {} doesn't exist", filename)); let mut contents = String::new(); file.read_to_string(&mut contents).expect("config.toml is not UTF-8 formatted"); toml::from_str(&contents).expect("config.toml is not a valid TOML file") } } }; } generate_loader!(ServerConfig); generate_loader!(GrabberConfig); generate_loader!(SecurityConfig);