use serde::Serialize; use serde::Deserialize; use std::fs; use std::env; #[derive(Serialize, Deserialize, Debug)] pub struct Config { pub streams: Streams, } #[derive(Serialize, Deserialize, Debug)] pub struct Streams { pub input: Stream, pub output: Stream, } #[derive(Serialize, Deserialize, Debug)] pub struct Stream { pub engine: Engine, pub format: Option, pub debug: bool, } #[derive(Serialize, Deserialize, Debug)] pub struct Engine { pub name: String, pub kafka: Option, pub device: Option, pub udp: Option, pub gui: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct Device { } #[derive(Serialize, Deserialize, Debug)] pub struct GUI { pub buttons: Buttons, pub press: PreSufFix, pub release: PreSufFix, pub format: Option, pub user: String, pub feedback: GUIFeedback, } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct GUIFeedback { pub url: Option, } #[derive(Serialize, Deserialize, Debug)] pub struct PreSufFix { pub prefix: String, pub suffix: String, } #[derive(Serialize, Deserialize, Debug)] pub struct Buttons { pub up: String, pub down: String, pub left: String, pub right: String, pub a: String, pub b: String, pub x: String, pub y: String, pub l: String, pub r: String, } #[derive(Serialize, Deserialize, Debug)] pub struct Kafka { pub addr: String, pub topic: String, pub consumer_group: String, pub crt: String, } #[derive(Serialize, Deserialize, Debug)] pub struct UDP { pub host: Option, pub port: i32, } pub fn build_config() -> Result { match env::var("CONFIG_PATH") { Ok(p) => return build_config_yaml(p), Err(_) => match build_config_yaml(String::from("./rusty-pipe.yaml")) { Ok(v) => return Ok(v), Err(_) => return Ok(build_config_std()), }, }; } fn build_config_yaml(path: String) -> Result { match fs::read_to_string(&path) { Ok(buffer) => match serde_yaml::from_str(&buffer) { Ok(result) => Ok(result), Err(err) => Err(err.to_string()), }, Err(err) => Err(err.to_string()), } } fn build_config_std() -> Config { return Config { streams: Streams{ input: Stream { debug: env::var("DEBUG").unwrap_or(String::from("false")) == "true", format: match env::var("INPUT_FORMAT") { Ok(x) => Some(x), Err(_) => None, }, engine: Engine{ name: env::var("INPUT_NAME").unwrap_or(String::from("stdin")), kafka: None, gui: Some(GUI{ buttons: Buttons{ up: env::var("INPUT_GUI_BUTTON_UP").unwrap_or(String::from("w")), left: env::var("INPUT_GUI_BUTTON_LEFT").unwrap_or(String::from("a")), down: env::var("INPUT_GUI_BUTTON_DOWN").unwrap_or(String::from("s")), right: env::var("INPUT_GUI_BUTTON_RIGHT").unwrap_or(String::from("d")), a: env::var("INPUT_GUI_BUTTON_A").unwrap_or(String::from("1")), b: env::var("INPUT_GUI_BUTTON_B").unwrap_or(String::from("2")), x: env::var("INPUT_GUI_BUTTON_X").unwrap_or(String::from("3")), y: env::var("INPUT_GUI_BUTTON_Y").unwrap_or(String::from("4")), l: env::var("INPUT_GUI_BUTTON_L").unwrap_or(String::from("q")), r: env::var("INPUT_GUI_BUTTON_R").unwrap_or(String::from("e")), }, press: PreSufFix{ prefix: env::var("INPUT_GUI_PRESS_PREFIX").unwrap_or(String::from("")), suffix: env::var("INPUT_GUI_PRESS_SUFFIX").unwrap_or(String::from("")), }, release: PreSufFix{ prefix: env::var("INPUT_GUI_RELEASE_PREFIX").unwrap_or(String::from("")), suffix: env::var("INPUT_GUI_RELEASE_SUFFIX").unwrap_or(String::from("")), }, user: env::var("INPUT_GUI_USER").unwrap_or(String::from("me")), format: match env::var("INPUT_GUI_FORMAT") { Ok(x) => Some(x), Err(_) => match env::var("INPUT_GUI_FORMAT_V01").unwrap_or(String::from("false")) == String::from("true") { true => Some(String::from("{\"T\":{{ms}},\"U\":\"{{user}}\",\"Y\":\"{{pressed}}\",\"N\":\"{{released}}\"}")), false => None, }, }, feedback: GUIFeedback{ url: match env::var("INPUT_GUI_FEEDBACK_URL") { Ok(url) => Some(url), Err(_) => None, }, }, }), device: None, udp: Some(UDP{ host: Some(env::var("INPUT_UDP_HOST").unwrap_or(String::from("localhost"))), port: env::var("INPUT_UDP_PORT").unwrap_or(String::from("17070")).parse().unwrap(), }), }, }, output: Stream { debug: env::var("DEBUG").unwrap_or(String::from("false")) == "true", format: match env::var("OUTPUT_FORMAT") { Ok(x) => Some(x), Err(_) => None, }, engine: Engine{ name: env::var("OUTPUT_NAME").unwrap_or(String::from("stdout")), kafka: None, gui: None, device: None, udp: Some(UDP{ host: Some(env::var("OUTPUT_UDP_HOST").unwrap_or(String::from("localhost"))), port: env::var("OUTPUT_UDP_PORT").unwrap_or(String::from("17070")).parse().unwrap(), }), }, }, }, }; } #[cfg(test)] mod tests { use super::*; #[test] fn test_build_config_std() { build_config_std(); } #[test] fn test_build_config_yaml() { build_config_yaml("./src/testdata/config-kinesis-to-kafka.json".to_string()).unwrap(); build_config_yaml("./src/testdata/config-stdin-to-stdout.yaml".to_string()).unwrap(); } }