mac-usernotifications 0.1.0

Thin wrapper around macOS UserNotifications.
Documentation
use mac_usernotifications::{Action, Notification};

mod common;

const ACTION_OPEN: &str = "action.open";
const ACTION_SAVE: &str = "action.save";
const ACTION_DISCARD: &str = "action.discard";

fn notify_back(title: &str, message: &str) {
    let _ = Notification::new()
        .title(title)
        .message(message)
        .send_blocking();
}

fn main() {
    if !common::setup(file!()) {
        return;
    }

    let notification = Notification::new()
        .title("Download complete")
        .message("report-2026-05.pdf is ready.")
        .action(Action::button(ACTION_OPEN, "Open"))
        .action(Action::button(ACTION_SAVE, "Save to Downloads"))
        .action(Action::button(ACTION_DISCARD, "Discard").requires_authentication())
        .timeout(std::time::Duration::from_secs(60));

    log::warn!("sending notification, waiting for user response…");

    let response = notification
        .send_blocking()
        .and_then(|sent| sent.response_blocking());

    match response {
        Ok(response) if response.is_default_action() => {
            log::warn!("user clicked the notification body");
            notify_back("Opening file…", "report-2026-05.pdf is being opened.");
        }
        Ok(response) if response.is_dismiss_action() => {
            log::warn!("user dismissed the notification");
        }
        Ok(response) if response.action_identifier == ACTION_OPEN => {
            log::warn!("user chose: open");
            notify_back("Opening file…", "report-2026-05.pdf is being opened.");
        }
        Ok(response) if response.action_identifier == ACTION_SAVE => {
            log::warn!("user chose: save");
            notify_back("Saved ✓", "report-2026-05.pdf saved to Downloads.");
        }
        Ok(response) if response.action_identifier == ACTION_DISCARD => {
            log::warn!("user chose: discard");
            notify_back("Discarded", "report-2026-05.pdf was deleted.");
        }
        Ok(response) if response.is_timed_out() => {
            log::warn!("timed out waiting for user response");
        }
        Ok(response) => {
            log::warn!("unknown action: {}", response.action_identifier);
        }
        Err(error) => {
            log::error!("error: {error}");
        }
    }

    log::warn!("done");
}