put diary date parser into yz-diary-date; improve dbtin parser, return HashMap

fogti
Sep 5, 2021, 7:43 AM
2VLV4YJDD77AR7ZRTJ6YZ3WJWLV2A4OKHBJY25YKQVFYUHMJ5SZAC

Dependencies

  • [2] PIAOZYFB dbtin: add parser for double-colon-separated format (similar to the passwd format)
  • [3] 5OQGNADF add tgs support to zhed-misc-parsers
  • [4] V4EAN7NN move some stuff around; more packlist stuff
  • [5] VLUIVUU5 initialize repository
  • [6] BUI22CYQ +zhed-packlist

Change contents

  • file deletion: date.rs (----------)
    [5.1856][5.5171:5202](),[5.5202][5.5203:5203]()
    use chrono::NaiveDate;
    use std::path::Path;
    fn fti_digits(s: &str) -> bool {
    s.len() >= 2 && s.chars().take(2).all(|i| i.is_ascii_digit())
    }
    pub fn parse_diary_date(par: &str, fin: &str) -> Option<NaiveDate> {
    if !fti_digits(fin) || par.len() < 4 {
    return None;
    }
    let y = par.parse::<i32>().ok()?;
    let m = fin[..2].parse::<u32>().unwrap();
    // verify the day info
    let mut dayinf = &fin[2..];
    if dayinf.starts_with(|i| matches!(i, '-' | '_')) {
    dayinf = &dayinf[1..];
    }
    if !fti_digits(dayinf) {
    return None;
    }
    let d = dayinf[..2].parse::<u32>().unwrap();
    chrono::NaiveDate::from_ymd_opt(y, m, d)
    }
    /// tries to parse a diary entry path to extract the reference date
    /// should be usually given a path containing at least 2 components
    pub fn parse_diary_date_from_path(x: &Path) -> Option<NaiveDate> {
    let mut fin = x;
    let mut fins = fin.file_name()?.to_str()?;
    // we allow 1 additional path component after the date part
    if !fti_digits(fins) {
    fin = x.parent()?;
    fins = fin.file_name()?.to_str()?;
    if !fti_digits(fins) {
    return None;
    }
    }
    let par = fin.parent()?.file_name()?.to_str()?;
    parse_diary_date(par, fins)
    }
    #[cfg(test)]
    mod tests {
    use super::*;
    #[test]
    fn diary_standard() {
    assert_eq!(parse_diary_date_from_path(Path::new("201/01_01")), None);
    assert_eq!(parse_diary_date_from_path(Path::new("2016/0")), None);
    assert_eq!(
    parse_diary_date_from_path(Path::new("2016/08_28")),
    Some(NaiveDate::from_ymd(2016, 08, 28))
    );
    assert_eq!(
    parse_diary_date_from_path(Path::new("teller/2016/08_28")),
    Some(NaiveDate::from_ymd(2016, 08, 28))
    );
    assert_eq!(
    parse_diary_date_from_path(Path::new("teller/2016/08_28nox/fluppig.jpg")),
    Some(NaiveDate::from_ymd(2016, 08, 28))
    );
    assert_eq!(
    parse_diary_date_from_path(Path::new("/blog/2017/1124y_vf.html")),
    Some(NaiveDate::from_ymd(2017, 11, 24))
    );
    }
    }
  • replacement in crates/zhed-misc-parsers/src/tgs.rs at line 17
    [3.549][3.549:619]()
    ret.insert(&x[..p], vec![x[p+2..].trim_start()]);
    [3.549]
    [3.619]
    ret.insert(&x[..p], vec![x[p + 2..].trim_start()]);
  • replacement in crates/zhed-misc-parsers/src/tgs.rs at line 89
    [3.2565][3.2565:2594]()
    assert_eq!(parse(r#"
    [3.2565]
    [3.2594]
    assert_eq!(
    parse(
    r#"
  • replacement in crates/zhed-misc-parsers/src/tgs.rs at line 112
    [3.2842][3.2842:2861]()
    "#, &trtab), res);
    [3.2842]
    [3.2861]
    "#,
    &trtab
    ),
    res
    );
  • edit in crates/zhed-misc-parsers/src/lib.rs at line 1
    [5.1888][5.1889:1924]()
    mod date;
    pub use crate::date::*;
  • replacement in crates/zhed-misc-parsers/src/lib.rs at line 5
    [3.2880][3.2880:2922]()
    pub use crate::tgs::{parse as parse_tgs};
    [3.2880]
    pub use crate::tgs::parse as parse_tgs;
  • edit in crates/zhed-misc-parsers/src/dbtin.rs at line 2
    [5.2066]
    [5.2066]
    type Branch<'a> = HashMap<&'a str, Node<'a>>;
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 7
    [5.2122][5.2122:2162]()
    Branch(HashMap<&'a str, Node<'a>>),
    [5.2122]
    [5.2162]
    Branch(Branch<'a>),
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 27
    [5.2317][5.2317:2361]()
    pub fn parse(s: &str) -> Option<Node<'_>> {
    [5.2317]
    [2.87]
    pub fn parse(s: &str) -> Option<Branch<'_>> {
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 42
    [2.449][2.449:573]()
    fn parse_colsv<'a>(it: impl Iterator<Item = &'a str>) -> Option<Node<'a>> {
    let mut ret = Node::Branch(HashMap::new());
    [2.449]
    [2.573]
    fn parse_colsv<'a>(it: impl Iterator<Item = &'a str>) -> Option<Branch<'a>> {
    let mut ret = HashMap::new();
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 54
    [2.890][2.890:926]()
    let sel = ret.select(obj)?;
    [2.890]
    [2.926]
    let sel = select(&mut ret, obj)?;
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 63
    [2.1032][2.1032:1109](),[2.1109][5.2361:2436](),[5.2361][5.2361:2436]()
    fn parse_groups<'a>(it: impl Iterator<Item = &'a str>) -> Option<Node<'a>> {
    let mut ret = Node::Branch(HashMap::new());
    let mut selobj = None;
    [2.1032]
    [5.2436]
    #[derive(Default)]
    struct GroupParser<'a> {
    ret: Branch<'a>,
    selobj: Option<(&'a str, HashMap<&'a str, &'a str>)>,
    }
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 69
    [5.2437][5.2437:2681]()
    macro_rules! finish_selobj {
    () => {{
    if let Some((oname, okvm)) = selobj.take() {
    if !ret.push_to_leaves(oname, okvm) {
    return None;
    }
    }
    }};
    }
    [5.2437]
    [5.2772]
    fn parse_groups<'a>(it: impl Iterator<Item = &'a str>) -> Option<Branch<'a>> {
    let mut gp = GroupParser::default();
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 77
    [5.2855][5.2855:3000]()
    finish_selobj!();
    selobj = Some((&i[1..], HashMap::new()));
    } else if let Some((_, ref mut kvm)) = &mut selobj {
    [5.2855]
    [5.3000]
    if !gp.finish_selobj() {
    return None;
    }
    gp.selobj = Some((&i[1..], HashMap::new()));
    } else if let Some((_, ref mut kvm)) = &mut gp.selobj {
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 89
    [5.3151][5.3151:3187]()
    finish_selobj!();
    Some(ret)
    [5.3151]
    [2.1129]
    if gp.finish_selobj() {
    Some(gp.ret)
    } else {
    None
    }
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 96
    [2.1132][2.1132:1233]()
    fn final_leaf_push<'a>(sel: &mut HashMap<&'a str, Node<'a>>, key: &'a str, value: &'a str) -> bool {
    [2.1132]
    [2.1233]
    impl<'a> GroupParser<'a> {
    fn finish_selobj(&mut self) -> bool {
    if let Some((oname, okvm)) = self.selobj.take() {
    if let Some(sel) = select(&mut self.ret, oname) {
    okvm.into_iter()
    .all(|(key, value)| final_leaf_push(sel, key, value))
    } else {
    false
    }
    } else {
    true
    }
    }
    }
    fn final_leaf_push<'a>(sel: &mut Branch<'a>, key: &'a str, value: &'a str) -> bool {
  • edit in crates/zhed-misc-parsers/src/dbtin.rs at line 118
    [2.1424]
    [5.3187]
    }
    fn select<'s, 'a>(ret: &'s mut Branch<'a>, obj: &'a str) -> Option<&'s mut Branch<'a>> {
    obj.split('/')
    .filter(|i| !i.is_empty())
    .try_fold(ret, |sel, i| {
    sel.entry(i)
    .or_insert_with(|| Node::Branch(HashMap::new()))
    .branch_mut()
    })
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 131
    [5.3210][2.1425:1509]()
    fn branch_mut<'s>(&'s mut self) -> Option<&'s mut HashMap<&'a str, Node<'a>>> {
    [5.3210]
    [2.1509]
    fn branch_mut<'s>(&'s mut self) -> Option<&'s mut Branch<'a>> {
  • edit in crates/zhed-misc-parsers/src/dbtin.rs at line 136
    [2.1595][5.3746:3756](),[5.3746][5.3746:3756](),[5.3756][2.1596:1602](),[2.1602][5.3756:3757](),[5.3756][5.3756:3757](),[5.3757][2.1603:1965](),[2.1965][5.4023:4024](),[5.4023][5.4023:4024](),[5.4024][2.1966:2234]()
    }
    }
    fn select<'s>(&'s mut self, obj: &'a str) -> Option<&'s mut HashMap<&'a str, Node<'a>>> {
    obj.split('/')
    .filter(|i| !i.is_empty())
    .try_fold(self.branch_mut()?, |sel, i| {
    sel.entry(i)
    .or_insert_with(|| Node::Branch(HashMap::new()))
    .branch_mut()
    })
    }
    fn push_to_leaves(&mut self, obj: &'a str, kvm: HashMap<&'a str, &'a str>) -> bool {
    if let Some(sel) = self.select(obj) {
    kvm.into_iter()
    .all(|(key, value)| final_leaf_push(sel, key, value))
    } else {
    false
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 144
    [2.2246][2.2246:2278]()
    fn ex0() -> Node<'static> {
    [2.2246]
    [5.4118]
    fn ex0() -> HashMap<&'static str, Node<'static>> {
  • replacement in crates/zhed-misc-parsers/src/dbtin.rs at line 167
    [2.2280][2.2280:2309]()
    Node::Branch(inner1)
    [2.2280]
    [2.2309]
    inner1
  • edit in crates/zhed-misc-parsers/Cargo.toml at line 9
    [5.7561][5.7561:7625]()
    [dependencies.chrono]
    version = "0.4"
    default-features = false
  • edit in Cargo.lock at line 145
    [5.3910][5.3910:3927](),[5.3927][4.12211:12222](),[4.12222][5.3941:3943](),[5.3941][5.3941:3943]()
    dependencies = [
    "chrono",
    ]