reminder_cli/
notification.rs

1use crate::reminder::Reminder;
2use crate::storage::Storage;
3use anyhow::Result;
4use std::fs::OpenOptions;
5use std::io::Write;
6
7pub fn send_notification(reminder: &Reminder) -> Result<()> {
8    let result = notify_rust::Notification::new()
9        .summary(&reminder.title)
10        .body(reminder.description.as_deref().unwrap_or(""))
11        .appname("Reminder CLI")
12        .timeout(notify_rust::Timeout::Milliseconds(10000))
13        .show();
14
15    match result {
16        Ok(_) => Ok(()),
17        Err(e) => {
18            eprintln!("Failed to show notification: {}, falling back to log", e);
19            log_reminder(reminder)
20        }
21    }
22}
23
24fn log_reminder(reminder: &Reminder) -> Result<()> {
25    let log_path = Storage::log_file_path()?;
26    let mut file = OpenOptions::new()
27        .create(true)
28        .append(true)
29        .open(log_path)?;
30
31    let timestamp = chrono::Local::now().format("%Y-%m-%d %H:%M:%S");
32    let description = reminder.description.as_deref().unwrap_or("");
33    
34    writeln!(
35        file,
36        "[{}] REMINDER: {} - {}",
37        timestamp, reminder.title, description
38    )?;
39
40    Ok(())
41}