ticker/src/ics/mod.rs

50 lines
1.3 KiB
Rust
Raw Normal View History

2019-10-06 23:28:39 +02:00
use std::collections::HashMap;
2019-10-11 21:24:43 +02:00
use chrono::{NaiveDate, NaiveDateTime};
2019-10-06 23:28:39 +02:00
mod tokenizer;
mod parser;
pub use parser::Parser;
2019-10-10 17:39:34 +02:00
pub trait GetValue<'a, R: 'a> {
fn get(&'a self, key: &'_ str) -> Option<R>;
}
2019-10-07 00:12:31 +02:00
pub type Props = Vec<(String, String)>;
2019-10-06 23:28:39 +02:00
#[derive(Debug, PartialEq)]
pub struct Object {
pub name: String,
2019-10-07 00:12:31 +02:00
pub content: HashMap<String, (Props, String)>,
2019-10-10 18:27:39 +02:00
pub children: Vec<Box<Object>>,
2019-10-07 00:12:31 +02:00
}
2019-10-10 17:39:34 +02:00
impl<'a> GetValue<'a, &'a str> for Object {
fn get(&'a self, key: &'_ str) -> Option<&'a str> {
2019-10-07 00:12:31 +02:00
self.content.get(key)
2019-10-07 00:20:42 +02:00
.map(|(_props, value)| value.as_ref())
2019-10-07 00:12:31 +02:00
}
2019-10-06 23:28:39 +02:00
}
2019-10-10 17:39:34 +02:00
impl<'a> GetValue<'a, String> for Object {
fn get(&self, key: &'_ str) -> Option<String> {
self.content.get(key)
.map(|(_props, value)| value.clone())
}
}
2019-10-10 18:27:39 +02:00
// TODO: TZID, offset
2019-10-11 21:24:43 +02:00
// TODO: enum for all day events?
2019-10-10 17:39:34 +02:00
impl<'a> GetValue<'a, NaiveDateTime> for Object {
fn get(&self, key: &'_ str) -> Option<NaiveDateTime> {
let s = self.get(key)?;
NaiveDateTime::parse_from_str(s, "%Y%m%dT%H%M%SZ")
.or_else(|_| NaiveDateTime::parse_from_str(s, "%Y%m%dT%H%M%S"))
2019-10-11 21:24:43 +02:00
.or_else(|_|
NaiveDate::parse_from_str(s, "%Y%m%d")
.map(|date| date.and_hms(0, 0, 0))
)
.map_err(|e| println!("Cannot parse date: {:?}", e))
2019-10-10 17:39:34 +02:00
.ok()
}
}