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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
use chrono::prelude::*; use log::Level; use rs_data_formats_derive::Name; use serde::{Deserialize, Serialize}; use serde_json::json; pub const TOPIC_PREFIX: &str = concat!("tg/", env!("CARGO_PKG_VERSION_MAJOR"), "/"); pub trait Name { fn name(&self) -> &'static str; } #[derive(Serialize, Deserialize, Debug)] pub struct Common { pub sender: String, pub application: String, pub time: DateTime<Utc>, pub payload: String, } #[derive(Serialize, Deserialize, Debug, Name)] pub struct Log { severity: Level, msg: String, } #[derive(Serialize, Deserialize, Debug, Name)] pub struct Kovaak { score: f32, scenario: String, hash: String, game_version: String, } fn topic_name<T: Name>(prefix: &str, sym: &T) -> String { format!("{}{}", prefix, sym.name().to_lowercase()) } pub fn build_msg<T: Name + Serialize>(sender: &str, data: T) -> (String, String) { ( topic_name(TOPIC_PREFIX, &data), json!(Common { sender: sender.to_string(), time: Utc::now(), application: data.name().to_lowercase(), payload: json!(&data).to_string(), }) .to_string(), ) } #[cfg(test)] mod tests { use super::*; #[test] fn test_topic_name() { let k = Kovaak { score: 0.0, scenario: format!(""), hash: format!(""), game_version: format!(""), }; assert_eq!("Kovaak", topic_name(TOPIC_PREFIX, &k)); } }