use std::io;
use cliclack::{clear_screen, intro, outro, outro_cancel, spinner};
use console::{style, Key, Term};
fn main() -> std::io::Result<()> {
ctrlc::set_handler(move || {}).expect("setting Ctrl-C handler");
clear_screen()?;
intro(style(" multiline support ").on_cyan().black())?;
let path: String = cliclack::input("Where should we create your project?\n👇")
.placeholder("./sparkling-solid")
.interact()?;
let _password = cliclack::password("Provide a password\n🔒")
.mask('▪')
.interact()?;
let _kind = cliclack::select(format!("Pick a project type within '{path}'\n💪"))
.initial_value("ts")
.item("ts", "TypeScript", "")
.item("js", "JavaScript", "")
.item("coffee", "CoffeeScript", "oh no")
.interact()?;
let _tools = cliclack::multiselect("Select additional tools\n🛠️")
.initial_values(vec!["prettier", "eslint"])
.item("prettier", "Prettier", "recommended")
.item("eslint", "ESLint", "recommended")
.item("stylelint", "Stylelint", "")
.item("gh-action", "GitHub Action", "")
.interact()?;
let spinner = spinner();
let message = format!(
"{}\n{}\n\n{}",
style("Installation").bold(),
style("Press Esc, Enter, or Ctrl-C").dim(),
style("Check it out, we're multilining!").magenta().italic()
);
spinner.start(message);
let term = Term::stderr();
loop {
match term.read_key() {
Ok(Key::Escape) => {
spinner.cancel("Installation");
outro_cancel("Cancelled")?;
}
Ok(Key::Enter) => {
spinner.stop("Installation");
outro("Done!")?;
}
Err(e) if e.kind() == io::ErrorKind::Interrupted => {
spinner.error("Installation");
outro_cancel("Interrupted")?;
}
_ => continue,
}
break;
}
Ok(())
}