use std::fmt::Debug;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::{MsgData, MsgDataBound, MsgTrace, Timestamp};
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct Message<TCustom> {
pub data: MsgData<TCustom>,
pub key: String,
pub ts: Timestamp,
pub trace: MsgTrace,
}
impl<TCustom> Message<TCustom>
where
TCustom: MsgDataBound,
{
pub fn new(data: MsgData<TCustom>) -> Self {
let key = define_key(&data);
Self {
data,
key,
ts: Default::default(),
trace: MsgTrace::default(),
}
}
pub fn new_custom(custom_data: TCustom) -> Self {
let data = MsgData::Custom(custom_data);
let key = define_key(&data);
Self {
data,
key,
ts: Default::default(),
trace: MsgTrace::default(),
}
}
pub fn get_data(&self) -> Option<TCustom> {
match &self.data {
MsgData::System(_) => None,
MsgData::Custom(data) => Some(data.clone()),
}
}
pub fn add_trace_item(&mut self, id: &Uuid, name: &str) {
self.trace.insert(*id, name.to_string())
}
pub fn contains_trace_item(&self, id: &Uuid) -> bool {
self.trace.contains_key(id)
}
}
fn define_key<TCustom>(data: &MsgData<TCustom>) -> String
where
TCustom: MsgDataBound,
{
let full_str = format!("{:?}", data);
let key = full_str.split('(').collect::<Vec<&str>>();
let skip = if key[key.len() - 2].is_empty() { 2 } else { 1 };
key[0..key.len() - skip].join("-")
}