1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
mod dialog;
mod stdio;
mod zenity;
pub use crate::backends::dialog::Dialog;
pub use crate::backends::stdio::Stdio;
pub use crate::backends::zenity::Zenity;
use std::env;
use std::path;
use crate::Result;
pub trait Backend {
fn show_input(&self, input: &super::Input) -> Result<Option<String>>;
fn show_message(&self, message: &super::Message) -> Result<()>;
fn show_password(&self, password: &super::Password) -> Result<Option<String>>;
fn show_question(&self, question: &super::Question) -> Result<super::Choice>;
}
pub(crate) fn is_available(name: &str) -> bool {
if let Ok(path) = env::var("PATH") {
for part in path.split(":") {
if path::Path::new(part).join(name).exists() {
return true;
}
}
}
false
}
pub(crate) fn from_str(s: &str) -> Option<Box<dyn Backend>> {
match s.to_lowercase().as_ref() {
"dialog" => Some(Box::new(Dialog::new())),
"stdio" => Some(Box::new(Stdio::new())),
"zenity" => Some(Box::new(Zenity::new())),
_ => None,
}
}