summaryrefslogtreecommitdiff
path: root/src/backends
diff options
context:
space:
mode:
authorRobin Krahl <robin.krahl@ireas.org>2019-01-08 03:49:42 +0000
committerRobin Krahl <robin.krahl@ireas.org>2019-01-08 04:54:39 +0100
commitfce7d2b9bf30e09b615dbd77b4dd7db94d623bfb (patch)
tree5a762e9b1147329c73234e7e06aab73a3970d911 /src/backends
parentec84c425282c3fd26f5e862b7864ad2ae7ec1e2e (diff)
downloaddialog-rs-fce7d2b9bf30e09b615dbd77b4dd7db94d623bfb.tar.gz
dialog-rs-fce7d2b9bf30e09b615dbd77b4dd7db94d623bfb.tar.bz2
Add question dialog boxes
Diffstat (limited to 'src/backends')
-rw-r--r--src/backends/dialog.rs33
-rw-r--r--src/backends/mod.rs3
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>;
}