native-dialog 0.9.6

A library to display dialogs. Supports GNU/Linux, BSD Unix, macOS and Windows.
Documentation
use std::path::PathBuf;

use objc2_app_kit::{NSModalResponseOK, NSOpenPanel};

use super::{DispatchResponse, NSSavePanelAsyncExt, NSURLExt};
use crate::ffi::UnsafeWindowHandle;

pub trait NSOpenPanelAsyncExt {
    fn spawn(&self, owner: UnsafeWindowHandle) -> DispatchResponse<Vec<PathBuf>>;
}

impl NSOpenPanelAsyncExt for NSOpenPanel {
    fn spawn(&self, owner: UnsafeWindowHandle) -> DispatchResponse<Vec<PathBuf>> {
        let owner = unsafe { owner.as_appkit() };

        self.begin(owner.as_deref(), move |panel, response| {
            let panel = panel.downcast_ref::<NSOpenPanel>().unwrap();

            (response == NSModalResponseOK)
                .then(|| panel.URLs())
                .map(|urls| urls.into_iter().filter_map(|x| x.to_path_buf()).collect())
                .unwrap_or_default()
        })
    }
}