Skip to content

Commit c8815cb

Browse files
author
Brendan Molloy
committed
Add support for channels more broadly
1 parent f1602b4 commit c8815cb

5 files changed

Lines changed: 256 additions & 193 deletions

File tree

Cargo.toml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,22 @@
22
name = "pahkat"
33
version = "0.6.0"
44
authors = ["Brendan Molloy <brendan@bbqsrc.net>"]
5+
edition = "2018"
56

67
[[bin]]
78
name = "pahkat"
89
path = "src/main.rs"
910
required-features = ["binaries"]
1011

1112
[dependencies]
12-
clap = { version = "*", optional = true }
13-
termcolor = { version = "0.3", optional = true }
13+
clap = { version = "2.32.0", optional = true }
14+
dialoguer = { version = "0.3.0", optional = true }
15+
termcolor = { version = "1.0.4", optional = true }
1416
pathdiff = { version = "0.1", optional = true }
15-
serde = "*"
16-
serde_derive = "*"
17-
serde_json = "*"
17+
url = { version = "1.7.2", optional = true}
18+
serde = "1.0.87"
19+
serde_derive = "1.0.87"
20+
serde_json = "1.0.38"
1821

1922
[features]
20-
binaries = ["clap", "termcolor", "pathdiff"]
23+
binaries = ["clap", "termcolor", "pathdiff", "dialoguer", "url"]

src/cli.rs

Lines changed: 38 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -2,79 +2,55 @@ use std::io;
22
use std::io::Write;
33
use std::collections::BTreeMap;
44
use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor};
5-
6-
#[cfg(target_os = "windows")]
7-
pub const INPUT_DEFAULT_LEN: usize = 2;
8-
#[cfg(not(target_os = "windows"))]
9-
pub const INPUT_DEFAULT_LEN: usize = 1;
5+
use dialoguer::{Confirmation, Input, Checkboxes, Select, theme::ColorfulTheme};
106

117
pub fn progress(color: Color, first: &str, rest: &str) -> Result<(), io::Error> {
12-
let mut stdout = StandardStream::stdout(ColorChoice::Always);
13-
try!(stdout.set_color(ColorSpec::new().set_fg(Some(color))
8+
let mut stderr = StandardStream::stderr(ColorChoice::Always);
9+
stderr.set_color(ColorSpec::new().set_fg(Some(color))
1410
.set_intense(true)
15-
.set_bold(true)));
16-
try!(write!(&mut stdout, "{:>12}", first));
17-
stdout.reset()?;
18-
writeln!(&mut stdout, " {}", rest)?;
11+
.set_bold(true))?;
12+
write!(&mut stderr, "{:>12}", first)?;
13+
stderr.reset()?;
14+
writeln!(&mut stderr, " {}", rest)?;
1915
Ok(())
2016
}
2117

2218
pub fn prompt_question(prompt: &str, default: bool) -> bool {
23-
let mut stdout = StandardStream::stdout(ColorChoice::Always);
24-
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Cyan))).unwrap();
25-
write!(&mut stdout, "{}? ", prompt).unwrap();
26-
stdout.reset().unwrap();
27-
28-
print!("({}) ", if default { "yes" } else { "no" });
29-
30-
let _ = io::stdout().flush();
31-
let mut input = String::new();
32-
33-
fn parse(it: &str) -> bool {
34-
let lower = it.to_lowercase();
35-
36-
if lower == "y" || lower == "yes" {
37-
return true;
38-
}
39-
40-
false
41-
}
42-
43-
match io::stdin().read_line(&mut input) {
44-
Ok(n) => {
45-
match n {
46-
0 => false,
47-
INPUT_DEFAULT_LEN => default,
48-
_ => parse(input.trim())
49-
}
50-
}
51-
Err(error) => panic!(error)
52-
}
19+
Confirmation::with_theme(&ColorfulTheme::default())
20+
.with_text(prompt)
21+
.default(default)
22+
.interact()
23+
.unwrap_or(default)
5324
}
5425

5526
pub fn prompt_line(prompt: &str, default: &str) -> Option<String> {
56-
let mut stdout = StandardStream::stdout(ColorChoice::Always);
57-
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Cyan))).unwrap();
58-
write!(&mut stdout, "{}: ", prompt).unwrap();
59-
stdout.reset().unwrap();
60-
61-
if default != "" {
62-
print!("({}) ", default);
63-
}
64-
65-
let _ = io::stdout().flush();
66-
let mut input = String::new();
27+
Some(Input::with_theme(&ColorfulTheme::default())
28+
.with_prompt(prompt)
29+
.default(default.to_string())
30+
.interact()
31+
.unwrap_or(default.to_string())
32+
.to_string())
33+
}
6734

68-
match io::stdin().read_line(&mut input) {
69-
Ok(n) => {
70-
match n {
71-
0 => None,
72-
INPUT_DEFAULT_LEN => Some(default.to_owned()),
73-
_ => Some(input.trim().to_owned())
74-
}
75-
}
76-
Err(error) => panic!(error)
77-
}
35+
pub fn prompt_multi_select(prompt: &str, options: &[&str]) -> Vec<String> {
36+
Checkboxes::with_theme(&ColorfulTheme::default())
37+
.with_prompt(prompt)
38+
.items(options)
39+
.interact()
40+
.unwrap_or(vec![])
41+
.into_iter()
42+
.map(|i| options[i].to_string())
43+
.collect()
44+
}
45+
46+
pub fn prompt_select(prompt: &str, options: &[String], default: usize) -> String {
47+
Select::with_theme(&ColorfulTheme::default())
48+
.with_prompt(prompt)
49+
.items(options)
50+
.default(default)
51+
.interact()
52+
.map(|i| options[i].to_string())
53+
.unwrap_or_else(|_| options[default].to_string())
7854
}
7955

8056
pub fn parse_platform_list(vec: &[String]) -> BTreeMap<String, String> {

0 commit comments

Comments
 (0)