Prepare for publish
This commit is contained in:
parent
6829f10496
commit
5399e0e64e
15
Cargo.toml
15
Cargo.toml
|
@ -1,8 +1,17 @@
|
||||||
[package]
|
[package]
|
||||||
name = "requestty"
|
name = "requestty"
|
||||||
version = "0.0.1"
|
version = "0.1.0"
|
||||||
authors = ["Lutetium Vanadium"]
|
authors = ["Lutetium Vanadium"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
description = "An easy-to-use collection of interactive cli prompts"
|
||||||
|
homepage="https://github.com/Lutetium-Vanadium/requestty#readme"
|
||||||
|
repository = "https://github.com/Lutetium-Vanadium/requestty"
|
||||||
|
documentation="https://docs.rs/requestty"
|
||||||
|
readme = "README.md"
|
||||||
|
license = "MIT"
|
||||||
|
keywords = ["interactive", "prompt", "cli", "inquirer", "enquirer"]
|
||||||
|
categories = ["command-line-interface", "command-line-utilities"]
|
||||||
|
exclude = ["/.github/*", "/assets", "/requestty-ui", "/requestty-macro", "*-snapshots"]
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
|
@ -13,8 +22,8 @@ members = [
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tempfile = "3"
|
tempfile = "3"
|
||||||
ui = { package = "requestty-ui", path = "./requestty-ui" }
|
ui = { package = "requestty-ui", path = "./requestty-ui", version = "=0.1.0" }
|
||||||
macro = { package = "requestty-macro", path = "./requestty-macro", optional = true }
|
macro = { package = "requestty-macro", path = "./requestty-macro", optional = true, version = "=0.1.0" }
|
||||||
|
|
||||||
smallvec = { version = "1.6", optional = true }
|
smallvec = { version = "1.6", optional = true }
|
||||||
|
|
||||||
|
|
150
README.md
150
README.md
|
@ -1,6 +1,150 @@
|
||||||
# Requestty
|
# Requestty
|
||||||
|
|
||||||
WIP rust clone of [Inquirer.js](https://github.com/SBoudrias/Inquirer.js)
|
![RustCI](https://github.com/Lutetium-Vanadium/requestty/workflows/Default/badge.svg)
|
||||||
|
![RustCI](https://github.com/Lutetium-Vanadium/requestty/workflows/Crossterm/badge.svg)
|
||||||
|
![RustCI](https://github.com/Lutetium-Vanadium/requestty/workflows/Termion/badge.svg)
|
||||||
|
[![Crates.io](https://img.shields.io/crates/v/requestty.svg)](https://crates.io/crates/requestty)
|
||||||
|
[![License](https://img.shields.io/crates/l/requestty.svg)](./LICENSE)
|
||||||
|
[![Documentation](https://docs.rs/requestty.svg)](https://docs.rs/requestty)
|
||||||
|
|
||||||
Minimum supported rust version (as per [cargo-msrv](https://crates.io/crates/cargo-msrv))
|
`requestty` (request-tty) is an easy-to-use collection of interactive
|
||||||
is `1.47`
|
cli prompts inspired by [Inquirer.js](https://github.com/SBoudrias/Inquirer.js).
|
||||||
|
|
||||||
|
- Easy-to-use - The builder API and macros allow you to easily configure
|
||||||
|
and use the in-built prompts.
|
||||||
|
|
||||||
|
- Extensible - Easily create and use custom prompts with a companion
|
||||||
|
ui rendering library.
|
||||||
|
|
||||||
|
- Flexible - All prompts can be used standalone or chained together.
|
||||||
|
|
||||||
|
- Dynamic - You can dynamically decide what questions should be asked
|
||||||
|
based on previous questions.
|
||||||
|
|
||||||
|
- Validation - You can validate user input with any prompt.
|
||||||
|
|
||||||
|
- Examples - Every prompt is accompanied with an example as well as other
|
||||||
|
[examples](./examples) for more complex workflows
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Add this to your `Cargo.toml`
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
requestty = "0.1.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let question = requestty::Question::expand("overwrite")
|
||||||
|
.message("Conflict on `file.rs`")
|
||||||
|
.choices(vec![
|
||||||
|
('y', "Overwrite"),
|
||||||
|
('a', "Overwrite this one and all next"),
|
||||||
|
('d', "Show diff"),
|
||||||
|
])
|
||||||
|
.default_separator()
|
||||||
|
.choice('x', "Abort")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
println!("{:#?}", requestty::prompt_one(question));
|
||||||
|
```
|
||||||
|
|
||||||
|
## In-built prompts
|
||||||
|
|
||||||
|
There are 10 in-built prompts:
|
||||||
|
|
||||||
|
- ### Input
|
||||||
|
|
||||||
|
Prompt that takes user input and returns a `String`.
|
||||||
|
|
||||||
|
<img src="./assets/input.gif" style="max-height: 11rem" />
|
||||||
|
|
||||||
|
- ### Password
|
||||||
|
|
||||||
|
Prompt that takes user input and hides it.
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<img
|
||||||
|
src="./assets/password-mask.gif"
|
||||||
|
style="max-width: 45%; max-height: 11rem"
|
||||||
|
/>
|
||||||
|
<img
|
||||||
|
src="./assets/password-hidden.gif"
|
||||||
|
style="max-width: 45%; max-height: 11rem"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
- ### Editor
|
||||||
|
|
||||||
|
Prompt that takes launches the users preferred editor on a temporary
|
||||||
|
file
|
||||||
|
|
||||||
|
<img src="./assets/editor.gif" style="max-height: 30rem" />
|
||||||
|
|
||||||
|
- ### Confirm
|
||||||
|
|
||||||
|
Prompt that returns `true` or `false`.
|
||||||
|
|
||||||
|
<img src="./assets/confirm.gif" style="max-height: 11rem" />
|
||||||
|
|
||||||
|
- ### Int
|
||||||
|
|
||||||
|
Prompt that takes a `i64` as input.
|
||||||
|
|
||||||
|
<img src="./assets/int.gif" style="max-height: 11rem" />
|
||||||
|
|
||||||
|
- ### Float
|
||||||
|
|
||||||
|
Prompt that takes a `f64` as input.
|
||||||
|
|
||||||
|
<img src="./assets/float.gif" style="max-height: 11rem" />
|
||||||
|
|
||||||
|
- ### Expand
|
||||||
|
|
||||||
|
Prompt that allows the user to select from a list of options by key
|
||||||
|
|
||||||
|
<img src="./assets/expand.gif" style="max-height: 15rem" />
|
||||||
|
|
||||||
|
- ### Select
|
||||||
|
|
||||||
|
Prompt that allows the user to select from a list of options
|
||||||
|
|
||||||
|
<img src="./assets/select.gif" style="max-height: 15rem" />
|
||||||
|
|
||||||
|
- ### RawSelect
|
||||||
|
|
||||||
|
Prompt that allows the user to select from a list of options with
|
||||||
|
indices
|
||||||
|
|
||||||
|
<img src="./assets/raw-select.gif" style="max-height: 15rem" />
|
||||||
|
|
||||||
|
- ### MultiSelect
|
||||||
|
|
||||||
|
Prompt that allows the user to select multiple items from a list of
|
||||||
|
options
|
||||||
|
|
||||||
|
<img src="./assets/multi-select.gif" style="max-height: 20rem" />
|
||||||
|
|
||||||
|
## Optional features
|
||||||
|
|
||||||
|
- `macros`: Enabling this feature will allow you to use the `questions`
|
||||||
|
and `prompt_module` macros.
|
||||||
|
|
||||||
|
- `smallvec` (default): Enabling this feature will use
|
||||||
|
[`SmallVec`](https://docs.rs/smallvec/1.6.1/smallvec/struct.SmallVec.html)
|
||||||
|
instead of `Vec` for auto completions. This allows inlining single
|
||||||
|
completions.
|
||||||
|
|
||||||
|
- `crossterm` (default): Enabling this feature will use the
|
||||||
|
[`crossterm`](https://crates.io/crates/crossterm) library for terminal
|
||||||
|
interactions such as drawing and receiving events.
|
||||||
|
|
||||||
|
- `termion`: Enabling this feature will use the
|
||||||
|
[`termion`](https://crates.io/crates/termion) library for terminal
|
||||||
|
interactions such as drawing and receiving events.
|
||||||
|
|
||||||
|
## Minimum Supported Rust Version (MSRV)
|
||||||
|
|
||||||
|
Minimum supported rust version (as per
|
||||||
|
[cargo-msrv](https://crates.io/crates/cargo-msrv)) is `1.47`
|
||||||
|
|
|
@ -1,8 +1,14 @@
|
||||||
[package]
|
[package]
|
||||||
name = "requestty-macro"
|
name = "requestty-macro"
|
||||||
version = "0.0.1"
|
version = "0.1.0"
|
||||||
authors = ["Lutetium Vanadium"]
|
authors = ["Lutetium Vanadium"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
description = "The `questions` macro for `requestty`"
|
||||||
|
homepage="https://github.com/Lutetium-Vanadium/requestty#readme"
|
||||||
|
repository = "https://github.com/Lutetium-Vanadium/requestty"
|
||||||
|
documentation="https://docs.rs/requestty-macro"
|
||||||
|
readme = "../README.md"
|
||||||
|
license = "MIT"
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
proc-macro = true
|
proc-macro = true
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
//! This crate is the declaration of the [`questions!`] macro. It should not be used directly. Use
|
//! This crate is the declaration of the [`questions!`] macro. It should not be used directly. Use
|
||||||
//! [`requestty`] instead.
|
//! [`requestty`] instead.
|
||||||
//!
|
//!
|
||||||
//! [`requestty`]: https://github.com/lutetium-vanadium/requestty
|
//! [`requestty`]: https://crates.io/crates/requestty
|
||||||
// TODO: [`requestty`]: https://crates.io/crates/requestty
|
|
||||||
|
|
||||||
extern crate proc_macro;
|
extern crate proc_macro;
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
|
|
|
@ -1,8 +1,16 @@
|
||||||
[package]
|
[package]
|
||||||
name = "requestty-ui"
|
name = "requestty-ui"
|
||||||
version = "0.0.1"
|
version = "0.1.0"
|
||||||
authors = ["Lutetium Vanadium"]
|
authors = ["Lutetium Vanadium"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
description = "A widget based terminal ui rendering library."
|
||||||
|
homepage="https://github.com/Lutetium-Vanadium/requestty#readme"
|
||||||
|
repository = "https://github.com/Lutetium-Vanadium/requestty"
|
||||||
|
documentation="https://docs.rs/requestty-ui"
|
||||||
|
license = "MIT"
|
||||||
|
keywords = ["interactive", "prompt", "cli", "inquirer", "enquirer"]
|
||||||
|
categories = ["command-line-interface", "command-line-utilities"]
|
||||||
|
exclude = ["*-snapshots"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
bitflags = "1.2"
|
bitflags = "1.2"
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
//! While this crate was built for the [`requestty`] crate and other crates which implement the
|
//! While this crate was built for the [`requestty`] crate and other crates which implement the
|
||||||
//! `Prompt` trait in [`requestty`], it can be used otherwise as well.
|
//! `Prompt` trait in [`requestty`], it can be used otherwise as well.
|
||||||
//!
|
//!
|
||||||
//! [`requestty`]: https://github.com/lutetium-vanadium/requestty
|
//! [`requestty`]: https://crates.io/crates/requestty
|
||||||
//!
|
//!
|
||||||
//! # Backends
|
//! # Backends
|
||||||
//!
|
//!
|
||||||
|
@ -15,7 +15,6 @@
|
||||||
//! - [`termion`](https://crates.io/crates/termion)
|
//! - [`termion`](https://crates.io/crates/termion)
|
||||||
//!
|
//!
|
||||||
//! The different backends can be enabled using the features of the same name.
|
//! The different backends can be enabled using the features of the same name.
|
||||||
// TODO: [`requestty`]: https://crates.io/crates/requestty
|
|
||||||
#![deny(
|
#![deny(
|
||||||
missing_docs,
|
missing_docs,
|
||||||
missing_debug_implementations,
|
missing_debug_implementations,
|
||||||
|
|
176
src/main.rs
176
src/main.rs
|
@ -1,176 +0,0 @@
|
||||||
// TODO: delete
|
|
||||||
// this is a temporary file, for testing out the prompts
|
|
||||||
use requestty::{DefaultSeparator, Question, Separator};
|
|
||||||
use std::env;
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let s = String::from("Hello there ");
|
|
||||||
|
|
||||||
let q = match env::args().nth(1).as_deref() {
|
|
||||||
Some("b") => vec![
|
|
||||||
Question::confirm("a").message("Hello there 1").build(),
|
|
||||||
Question::confirm("b")
|
|
||||||
.message("Hello there 2")
|
|
||||||
.default(true)
|
|
||||||
.build(),
|
|
||||||
],
|
|
||||||
Some("s") => vec![
|
|
||||||
Question::input("a").message("Hello there 2").into(),
|
|
||||||
Question::input("b")
|
|
||||||
.message(|_: &requestty::Answers| s[0..(s.len() - 1)].to_owned())
|
|
||||||
.filter(|mut ans, _| {
|
|
||||||
ans.insert_str(0, &s);
|
|
||||||
ans
|
|
||||||
})
|
|
||||||
.validate(|_, _| Ok(()))
|
|
||||||
.default("Yes")
|
|
||||||
.into(),
|
|
||||||
],
|
|
||||||
Some("p") => vec![
|
|
||||||
Question::password("a")
|
|
||||||
.message("password 1")
|
|
||||||
.filter(|ans, _| ans + &s)
|
|
||||||
.mask('*')
|
|
||||||
.into(),
|
|
||||||
Question::password("b").message("password 2").into(),
|
|
||||||
],
|
|
||||||
Some("i") => vec![
|
|
||||||
Question::int("a").message("int 1").into(),
|
|
||||||
Question::int("b").message("int 2").default(3).into(),
|
|
||||||
],
|
|
||||||
Some("f") => vec![
|
|
||||||
Question::float("a").message("float 1").into(),
|
|
||||||
Question::float("b").message("float 2").default(3.12).into(),
|
|
||||||
],
|
|
||||||
Some("e") => vec![
|
|
||||||
Question::editor("a")
|
|
||||||
.message("editor 1")
|
|
||||||
.default("Hello there")
|
|
||||||
.into(),
|
|
||||||
Question::editor("b")
|
|
||||||
.message("editor 2")
|
|
||||||
.extension(".rs")
|
|
||||||
.into(),
|
|
||||||
],
|
|
||||||
|
|
||||||
Some("l") => vec![
|
|
||||||
Question::select("a")
|
|
||||||
.message("select 1")
|
|
||||||
.choices(vec![
|
|
||||||
"0".into(),
|
|
||||||
DefaultSeparator,
|
|
||||||
"1".into(),
|
|
||||||
"2".into(),
|
|
||||||
"3".into(),
|
|
||||||
Separator("== Hello separator".into()),
|
|
||||||
])
|
|
||||||
.default(3)
|
|
||||||
.into(),
|
|
||||||
Question::select("b")
|
|
||||||
.message("select 2")
|
|
||||||
.choices(vec![
|
|
||||||
Separator("=== TITLE BOI ===".into()),
|
|
||||||
"hello worldssssss 1\nMulti-line description about it".into(),
|
|
||||||
"hello worldssssss 2".into(),
|
|
||||||
"hello worldssssss 3".into(),
|
|
||||||
"hello worldssssss 4".into(),
|
|
||||||
"hello worldssssss 5".into(),
|
|
||||||
DefaultSeparator,
|
|
||||||
"hello worldssssss 6".into(),
|
|
||||||
"hello worldssssss 7".into(),
|
|
||||||
"hello worldssssss 8".into(),
|
|
||||||
])
|
|
||||||
.page_size(6)
|
|
||||||
.should_loop(false)
|
|
||||||
.into(),
|
|
||||||
],
|
|
||||||
|
|
||||||
Some("c") => vec![
|
|
||||||
Question::multi_select("a")
|
|
||||||
.message("multi select 1")
|
|
||||||
.choice_with_default("0", true)
|
|
||||||
.default_separator()
|
|
||||||
.choices_with_default(vec![("1", false), ("2", true), ("3", false)])
|
|
||||||
.separator("== Hello separator")
|
|
||||||
.into(),
|
|
||||||
Question::multi_select("b")
|
|
||||||
.message("multi select 2")
|
|
||||||
.choices(vec![
|
|
||||||
Separator("=== TITLE BOI ===".into()),
|
|
||||||
"hello worldssssss 1\nMulti-line description about it".into(),
|
|
||||||
"hello worldssssss 2".into(),
|
|
||||||
"hello worldssssss 3".into(),
|
|
||||||
"hello worldssssss 4".into(),
|
|
||||||
"hello worldssssss 5".into(),
|
|
||||||
DefaultSeparator,
|
|
||||||
"hello worldssssss 6".into(),
|
|
||||||
"hello worldssssss 7".into(),
|
|
||||||
"hello worldssssss 8".into(),
|
|
||||||
])
|
|
||||||
.page_size(6)
|
|
||||||
.should_loop(false)
|
|
||||||
.into(),
|
|
||||||
],
|
|
||||||
|
|
||||||
Some("r") => vec![
|
|
||||||
Question::raw_select("a")
|
|
||||||
.message("select 1")
|
|
||||||
.choices(vec![
|
|
||||||
"0".into(),
|
|
||||||
DefaultSeparator,
|
|
||||||
"1".into(),
|
|
||||||
"2".into(),
|
|
||||||
"3".into(),
|
|
||||||
Separator("== Hello separator".into()),
|
|
||||||
])
|
|
||||||
.default(2)
|
|
||||||
.into(),
|
|
||||||
Question::raw_select("b")
|
|
||||||
.message("select 2")
|
|
||||||
.choices(vec![
|
|
||||||
Separator("=== TITLE BOI ===".into()),
|
|
||||||
"hello worldssssss 1\nMulti-line description about it".into(),
|
|
||||||
"hello worldssssss 2".into(),
|
|
||||||
"hello worldssssss 3".into(),
|
|
||||||
"hello worldssssss 4".into(),
|
|
||||||
"hello worldssssss 5".into(),
|
|
||||||
DefaultSeparator,
|
|
||||||
"hello worldssssss 6".into(),
|
|
||||||
"hello worldssssss 7".into(),
|
|
||||||
"hello worldssssss 8".into(),
|
|
||||||
])
|
|
||||||
.page_size(6)
|
|
||||||
// .should_loop(false)
|
|
||||||
.into(),
|
|
||||||
],
|
|
||||||
|
|
||||||
Some("x") => vec![
|
|
||||||
Question::expand("a")
|
|
||||||
.message("expand 1")
|
|
||||||
.choices(vec![
|
|
||||||
('y', "Overwrite").into(),
|
|
||||||
('a', "Overwrite this one and all next").into(),
|
|
||||||
('d', "Show diff").into(),
|
|
||||||
DefaultSeparator,
|
|
||||||
('x', "Abort").into(),
|
|
||||||
])
|
|
||||||
.into(),
|
|
||||||
Question::expand("b")
|
|
||||||
.message("expand 2")
|
|
||||||
.choice('a', "Name for a")
|
|
||||||
.default_separator()
|
|
||||||
.choices(vec![
|
|
||||||
('b', "Name for b\nMulti-line description"),
|
|
||||||
('c', "Name for c"),
|
|
||||||
])
|
|
||||||
.default_separator()
|
|
||||||
.choice('d', "Name for d")
|
|
||||||
.separator("== Hello separator")
|
|
||||||
.default('b')
|
|
||||||
.into(),
|
|
||||||
],
|
|
||||||
_ => panic!("no arg"),
|
|
||||||
};
|
|
||||||
|
|
||||||
println!("{:#?}", requestty::prompt(q));
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user