use crate::record::{PayloadState, WireRecord, WireRecordKind, WireStore};
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct TimelineEntry {
pub time: String,
pub conversation: Option<String>,
pub sender: Option<String>,
pub message_type: Option<String>,
pub payload: PayloadState,
pub deleted: bool,
}
#[must_use]
pub fn timeline(store: &WireStore) -> Vec<TimelineEntry> {
let mut entries: Vec<TimelineEntry> = store
.records
.iter()
.filter(|r| r.kind == WireRecordKind::Event)
.filter_map(entry_for)
.collect();
entries.sort_by(|a, b| a.time.cmp(&b.time));
entries
}
fn entry_for(r: &WireRecord) -> Option<TimelineEntry> {
let time = r.time.clone()?;
Some(TimelineEntry {
time,
conversation: r.conversation.clone(),
sender: r.sender.clone(),
message_type: r.message_type.clone(),
payload: r.payload.clone(),
deleted: r.deleted,
})
}