File: parse-date.rs

package info (click to toggle)
rust-chrono-english 0.1.7-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 144 kB
  • sloc: makefile: 2
file content (72 lines) | stat: -rw-r--r-- 1,702 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
extern crate chrono_english;
use chrono_english::{parse_date_string, Dialect};

extern crate chrono;
use chrono::prelude::*;

extern crate lapp;

use std::error::Error;
use std::fmt::Display;
type BoxResult<T> = Result<T, Box<dyn Error>>;

const USAGE: &str = "
Parsing Dates in English
  -a, --american informal dates are like 9/11 not 20/03
  -u, --utc  evaluate in UTC, not Local timezone
  <date> (string) the date
  <base> (default now) the base for relative dates
";

const FMT_C: &str = "%c %z";
const FMT_ISO: &str = "%+";

fn parse_and_compare<Tz: TimeZone>(
    datestr: &str,
    basestr: &str,
    now: DateTime<Tz>,
    dialect: Dialect,
) -> BoxResult<()>
where
    Tz::Offset: Display,
    Tz::Offset: Copy,
{
    let def = basestr == "now";
    let base = parse_date_string(basestr, now, dialect)?;
    let date_time = parse_date_string(&datestr, base, dialect)?;
    if !def {
        println!("base {} ({})", base.format(FMT_C), base.format(FMT_ISO));
    }
    println!(
        "calc {} ({})",
        date_time.format(FMT_C),
        date_time.format(FMT_ISO)
    );
    Ok(())
}

fn run() -> BoxResult<()> {
    let args = lapp::parse_args(USAGE);
    let utc = args.get_bool("utc");
    let datestr = args.get_string("date");
    let basestr = args.get_string("base");
    let dialect = if args.get_bool("american") {
        Dialect::Us
    } else {
        Dialect::Uk
    };
    if utc {
        parse_and_compare(&datestr, &basestr, Utc::now(), dialect)?;
    } else {
        parse_and_compare(&datestr, &basestr, Local::now(), dialect)?;
    }

    Ok(())
}

fn main() {
    if let Err(e) = run() {
        eprintln!("error: {}", e);
        std::process::exit(1);
    }
}