native-dialog 0.9.6

A library to display dialogs. Supports GNU/Linux, BSD Unix, macOS and Windows.
Documentation
use dispatch2::run_on_main;
use objc2::MainThreadMarker;
use objc2::rc::Retained as Id;
use objc2_app_kit::{NSAlert, NSAlertFirstButtonReturn};

use crate::Result;
use crate::dialog::{DialogImpl, MessageAlert, MessageConfirm};
use crate::ffi::mac::NSAlertExt;

impl MessageAlert {
    fn create(&self, mtm: MainThreadMarker) -> Id<NSAlert> {
        let alert = NSAlert::new(mtm);

        alert.set_informative_text(&self.text);
        alert.set_message_text(&self.title);
        alert.set_level_icon(self.level);

        alert
    }
}

impl DialogImpl for MessageAlert {
    fn show(self) -> Result<Self::Output> {
        run_on_main(|mtm| {
            let alert = self.create(mtm);
            alert.show(self.owner)
        });

        Ok(())
    }

    #[cfg(feature = "async")]
    async fn spawn(self) -> Result<Self::Output> {
        use crate::ffi::mac::NSAlertAsyncExt;

        let res = run_on_main(|mtm| {
            let alert = self.create(mtm);
            alert.spawn(self.owner)
        });

        res.await;
        Ok(())
    }
}

impl MessageConfirm {
    fn create(&self, mtm: MainThreadMarker) -> Id<NSAlert> {
        let alert = NSAlert::new(mtm);

        alert.set_informative_text(&self.text);
        alert.set_message_text(&self.title);
        alert.set_level_icon(self.level);

        alert.add_button("Yes");
        alert.add_button("No");

        alert
    }
}

impl DialogImpl for MessageConfirm {
    fn show(self) -> Result<Self::Output> {
        let res = run_on_main(|mtm| {
            let alert = self.create(mtm);
            alert.show(self.owner)
        });

        Ok(res == NSAlertFirstButtonReturn)
    }

    #[cfg(feature = "async")]
    async fn spawn(self) -> Result<Self::Output> {
        use crate::ffi::mac::NSAlertAsyncExt;

        let res = run_on_main(|mtm| {
            let alert = self.create(mtm);
            alert.spawn(self.owner)
        });

        Ok(res.await == NSAlertFirstButtonReturn)
    }
}