blob: fa797838daa1347d887272abd06952ea786a174e [file] [log] [blame]
extern crate chrono_english;
use chrono_english::{parse_date_string,Dialect};
extern crate chrono;
use chrono::prelude::*;
extern crate lapp;
use std::fmt::Display;
use std::error::Error;
type BoxResult<T> = Result<T,Box<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 base = parse_date_string(basestr, now, dialect)?;
let date_time = parse_date_string(&datestr, base, dialect)?;
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.description());
std::process::exit(1);
}
}