use serde::Deserialize;
use serde::Serialize;
use std::collections::HashMap;
use crate::output::output::OutputKind;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct OutputMsg {
pub kind: OutputKind,
pub template: String,
pub fields: HashMap<String, serde_json::Value>,
}
impl OutputMsg {
pub fn new(kind: OutputKind, template: &str) -> Self {
Self {
kind,
template: template.to_string(),
fields: HashMap::new(),
}
}
pub fn field<T: Serialize + ?Sized>(mut self, key: &str, value: &T) -> Self {
self.fields.insert(
key.to_string(),
serde_json::to_value(value).unwrap_or(serde_json::Value::Null),
);
self
}
}
#[macro_export]
macro_rules! print_template {
(ExportContext::$variant:ident, $kind:expr, $template:expr, $($key:expr => $val:expr),* $(,)?) => {{
let mut t = $crate::output::msg::OutputMsg::new($kind, $template);
t = t.field("export", $crate::output::output::ExportContext::$variant.as_str());
$(
t = t.field($key, &$val);
)*
$crate::configs::app::AppConfig::output().write(&t);
}};
($kind:expr, $template:expr, $($key:expr => $val:expr),* $(,)?) => {{
let mut t = $crate::output::msg::OutputMsg::new($kind, $template);
$(
t = t.field($key, &$val);
)*
$crate::configs::app::AppConfig::output().write(&t);
}};
}
#[macro_export]
macro_rules! print_text {
($kind:expr, $($arg:tt)*) => {{
let msg = format!($($arg)*);
let t = $crate::output::msg::OutputMsg::new($kind, &msg);
$crate::configs::app::AppConfig::output().write(&t);
}};
}