use time;
use time::Tm;
use serde_json;
use serde::ser::{Serialize, Serializer};
use serde::ser::SerializeTuple;
use event_time::EventTime;
use dumpable::Dumpable;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EventRecord<T: Serialize> {
tag: String,
event: Vec<Event<T>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct Event<T: Serialize> {
event_time: EventTime,
record: T,
}
impl<T: Serialize> Event<T> {
pub fn new(event_time: EventTime, record: T) -> Event<T> {
Event {
event_time: event_time,
record: record,
}
}
pub fn get_record(&self) -> &T {
&self.record
}
pub fn get_event_time(&self) -> &EventTime {
&self.event_time
}
}
impl<T: Serialize> EventRecord<T> {
pub fn new(tag: String, time: Tm, record: T) -> EventRecord<T> {
EventRecord {
tag: tag,
event: vec![Event::new(EventTime::new(time), record)],
}
}
}
impl<T: Serialize> Dumpable for EventRecord<T> {
fn dump(self) -> String {
format!("{}\t{}\t{}\n",
time::strftime("%FT%T%z", &self.event[0].get_event_time().get_time()).unwrap(),
self.tag,
serde_json::to_string(&self.event[0].get_record()).unwrap())
}
}
impl<T: Serialize> Serialize for EventRecord<T> {
fn serialize<S: Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
let mut seq = s.serialize_tuple(3)?;
seq.serialize_element(&self.tag)?;
seq.serialize_element(&self.event)?;
seq.serialize_element(&None::<T>)?;
seq.end()
}
}
#[cfg(test)]
mod tests {
use super::*;
use time;
use time::Timespec;
use std::collections::HashMap;
use rmp_serde::encode::Serializer;
#[test]
fn test_msgpack_format() {
let tag = "fruently".to_string();
let timespec = Timespec::new(1494245571, 0);
let time = time::at(timespec);
let mut obj: HashMap<String, String> = HashMap::new();
obj.insert("name".to_string(), "fruently".to_string());
let record = EventRecord::new(tag.clone(), time, obj.clone());
let mut buf = vec![];
let _ = record.serialize(&mut Serializer::new(&mut buf)).unwrap();
assert_eq!(vec![0x93, 0xa8, 0x66, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79,
0x91, 0x92, 0xc4, 0x0a, 0xd7, 0x00, 0x59, 0x10, 0x60, 0xc3,
0x00, 0x00, 0x00, 0x00, 0x81, 0xa4, 0x6e, 0x61, 0x6d, 0x65,
0xa8, 0x66, 0x72, 0x75, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0xc0], buf);
}
}