use chrono::{DateTime, FixedOffset}; use markdown::{Block, Span}; use std::convert::identity; #[derive(Debug)] pub struct Doc<'src> { pub entries: Vec>, } impl<'src> Doc<'src> { // TODO: better parsing errors? pub fn new(f: &'src str) -> Option { let entries = f .split("\n## ") .map(|s| s.split_once("\n")) .skip(1) .filter_map(identity) .map(|(title, content)| (title.split_once(": "), content)) .map(|(title, content)| { if let Some((ts, title)) = title { Some(Entry { timestamp: DateTime::parse_from_rfc3339(ts).unwrap(), title, content: content.trim_matches('\n'), }) } else { None } }) .collect::>(); entries.iter().all(|it| it.is_some()).then_some(Self { entries: entries.into_iter().filter_map(identity).collect(), }) } } #[derive(Debug, Clone)] pub struct Entry<'src> { pub timestamp: DateTime, pub title: &'src str, pub content: &'src str, }