use crate::ResultType; use osascript; use serde_derive::{Deserialize, Serialize}; #[derive(Serialize)] struct AlertParams { title: String, message: String, alert_type: String, buttons: Vec, } #[derive(Deserialize)] struct AlertResult { #[serde(rename = "buttonReturned")] button: String, } /// Firstly run the specified app, then alert a dialog. Return the clicked button value. /// /// # Arguments /// /// * `app` - The app to execute the script. /// * `alert_type` - Alert type. . informational, warning, critical /// * `title` - The alert title. /// * `message` - The alert message. /// * `buttons` - The buttons to show. pub fn alert( app: String, alert_type: String, title: String, message: String, buttons: Vec, ) -> ResultType { let script = osascript::JavaScript::new(&format!( " var App = Application('{}'); App.includeStandardAdditions = true; return App.displayAlert($params.title, {{ message: $params.message, 'as': $params.alert_type, buttons: $params.buttons, }}); ", app )); let result: AlertResult = script.execute_with_params(AlertParams { title, message, alert_type, buttons, })?; Ok(result.button) }