nix-configs/programs/jrnl/src/md.rs

44 lines
1.2 KiB
Rust
Raw Normal View History

use chrono::{DateTime, FixedOffset};
use markdown::{Block, Span};
use std::convert::identity;
#[derive(Debug)]
pub struct Doc<'src> {
pub entries: Vec<Entry<'src>>,
}
impl<'src> Doc<'src> {
// TODO: better parsing errors?
pub fn new(f: &'src str) -> Option<Self> {
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::<Vec<_>>();
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<FixedOffset>,
pub title: &'src str,
pub content: &'src str,
}