diff options
author | Robin Krahl <robin.krahl@ireas.org> | 2019-01-08 03:49:42 +0000 |
---|---|---|
committer | Robin Krahl <robin.krahl@ireas.org> | 2019-01-08 04:54:39 +0100 |
commit | fce7d2b9bf30e09b615dbd77b4dd7db94d623bfb (patch) | |
tree | 5a762e9b1147329c73234e7e06aab73a3970d911 /src/backends | |
parent | ec84c425282c3fd26f5e862b7864ad2ae7ec1e2e (diff) | |
download | dialog-rs-fce7d2b9bf30e09b615dbd77b4dd7db94d623bfb.tar.gz dialog-rs-fce7d2b9bf30e09b615dbd77b4dd7db94d623bfb.tar.bz2 |
Add question dialog boxes
Diffstat (limited to 'src/backends')
-rw-r--r-- | src/backends/dialog.rs | 33 | ||||
-rw-r--r-- | src/backends/mod.rs | 3 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/backends/dialog.rs b/src/backends/dialog.rs index 8cde8cc..fb0f73f 100644 --- a/src/backends/dialog.rs +++ b/src/backends/dialog.rs @@ -5,7 +5,7 @@ use std::io; use std::io::Result; use std::process; -use crate::{Input, Message}; +use crate::{Choice, Input, Message, Question}; /// The `dialog` backend. /// @@ -87,6 +87,25 @@ fn require_success(status: process::ExitStatus) -> Result<()> { } } +fn get_choice(status: process::ExitStatus) -> Result<Choice> { + if let Some(code) = status.code() { + match code { + 0 => Ok(Choice::Yes), + 1 => Ok(Choice::No), + 255 => Ok(Choice::Cancel), + code => Err(io::Error::new( + io::ErrorKind::Other, + format!("Could not execute dialog: {}", code), + )), + } + } else { + Err(io::Error::new( + io::ErrorKind::Other, + "dialog was terminated by a signal", + )) + } +} + fn get_stderr(output: process::Output) -> Result<Option<String>> { if output.status.success() { String::from_utf8(output.stderr) @@ -99,10 +118,10 @@ fn get_stderr(output: process::Output) -> Result<Option<String>> { match code { 0 => Ok(None), 1 => Ok(None), - -1 => Ok(None), - _ => Err(io::Error::new( + 255 => Ok(None), + code => Err(io::Error::new( io::ErrorKind::Other, - "Could not execute dialog", + format!("Could not execute dialog: {}", code), )), } } else { @@ -131,4 +150,10 @@ impl super::Backend for Dialog { .and_then(|output| require_success(output.status)) .map(|_| ()) } + + fn show_question(&self, question: &Question) -> Result<Choice> { + let args = vec!["--yesno", &question.text]; + self.execute(args, vec![], &question.title) + .and_then(|output| get_choice(output.status)) + } } diff --git a/src/backends/mod.rs b/src/backends/mod.rs index 1abb8d1..12a178b 100644 --- a/src/backends/mod.rs +++ b/src/backends/mod.rs @@ -22,4 +22,7 @@ pub trait Backend { /// Shows the given message dialog. fn show_message(&self, message: &super::Message) -> Result<()>; + + /// Shows the given question dialog and returns the choice. + fn show_question(&self, question: &super::Question) -> Result<super::Choice>; } |