seems to work
This commit is contained in:
parent
25927d67e8
commit
929771711d
70
main.rs
70
main.rs
@ -3,8 +3,23 @@ use std::fs; // To list files
|
||||
use std::fs::File;
|
||||
use std::io::BufReader;
|
||||
use std::io::BufRead;
|
||||
use std::process::Command;
|
||||
|
||||
fn birthdate (filename: String) -> String {
|
||||
/* Execute notify program */
|
||||
fn notify (text: &String) {
|
||||
if cfg!(target_os = "windows") {
|
||||
println!("OS not suported");
|
||||
} else {
|
||||
let _ = Command::new("notify-send")
|
||||
.arg("Anniversaires")
|
||||
.arg(text)
|
||||
.output()
|
||||
.expect("failed to execute process");
|
||||
}
|
||||
}
|
||||
|
||||
/* Extract birthdate String from vcf file */
|
||||
fn birthdate (filename: &String) -> String {
|
||||
let file = File::open(filename).expect("file not found!");
|
||||
let reader = BufReader::new(file);
|
||||
for line in reader.lines() {
|
||||
@ -16,24 +31,65 @@ fn birthdate (filename: String) -> String {
|
||||
return "".to_string()
|
||||
}
|
||||
|
||||
/* Extract full name from vcf file */
|
||||
fn fullname (filename: &String) -> String {
|
||||
let file = File::open(filename).expect("file not found!");
|
||||
let reader = BufReader::new(file);
|
||||
for line in reader.lines() {
|
||||
let l:String = line.unwrap();
|
||||
if l.starts_with("FN:") {
|
||||
return l[3..].to_string();
|
||||
}
|
||||
}
|
||||
return "".to_string()
|
||||
}
|
||||
|
||||
/* Test if date a is before b in civil year */
|
||||
fn before_in_civil_year (a :&NaiveDate, b: &NaiveDate) -> bool{
|
||||
a.month()*100 + a.day() < b.month()*100 + b.day()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
/* Where are the vcf files */
|
||||
let vcf_dir = "/home/ilya/.contacts/contacts";
|
||||
|
||||
/* How much day before */
|
||||
let delta_d:u8 = 10;
|
||||
|
||||
let now = Local::now();
|
||||
let delta_d = 10;
|
||||
|
||||
let tz_today = Local::today();
|
||||
let today = NaiveDate::from_ymd(tz_today.year(), tz_today.month(), tz_today.day());
|
||||
|
||||
let paths = fs::read_dir(vcf_dir).unwrap();
|
||||
let mut output:String = "".to_string();
|
||||
|
||||
for path in paths {
|
||||
/* Get date string from vcf file */
|
||||
let filename :String = path.unwrap().path().into_os_string().into_string().unwrap();
|
||||
let bdate:String = birthdate(filename);
|
||||
let bdate:String = birthdate(&filename);
|
||||
if bdate == "" {
|
||||
continue
|
||||
}
|
||||
//println!("{}", bdate);
|
||||
println!("{}",UTC::Date(bdate));
|
||||
|
||||
/* Parse the date */
|
||||
let mut date = match bdate.len() {
|
||||
8 => Some(NaiveDate::parse_from_str(&bdate.to_string(), "%Y%m%d").unwrap()),
|
||||
10 => Some(NaiveDate::parse_from_str(&bdate.to_string(), "%Y-%m-%d").unwrap()),
|
||||
_ => None,
|
||||
}.expect("Date is of no known format");
|
||||
|
||||
/* set to y+1 to make it a future date, or to y */
|
||||
if before_in_civil_year(&date, &today) {
|
||||
date = date.with_year(today.year()+1).unwrap()
|
||||
} else {
|
||||
date = date.with_year(today.year()).unwrap()
|
||||
}
|
||||
|
||||
let bdate = UTC.from_local_date(&date).single().unwrap();
|
||||
|
||||
/* It is time to be alerted */
|
||||
if bdate.num_days_from_ce() - tz_today.num_days_from_ce() <= delta_d {
|
||||
output = format!("{}{}/{} {}\n", output, date.day(), date.month(), fullname(&filename));
|
||||
}
|
||||
}
|
||||
notify(&output);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user