Prepare for publish

This commit is contained in:
Lutetium-Vanadium 2021-07-17 18:15:08 +05:30
parent 6829f10496
commit 5399e0e64e
7 changed files with 177 additions and 188 deletions

View File

@ -1,8 +1,17 @@
[package]
name = "requestty"
version = "0.0.1"
version = "0.1.0"
authors = ["Lutetium Vanadium"]
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]
members = [
@ -13,8 +22,8 @@ members = [
[dependencies]
tempfile = "3"
ui = { package = "requestty-ui", path = "./requestty-ui" }
macro = { package = "requestty-macro", path = "./requestty-macro", optional = true }
ui = { package = "requestty-ui", path = "./requestty-ui", version = "=0.1.0" }
macro = { package = "requestty-macro", path = "./requestty-macro", optional = true, version = "=0.1.0" }
smallvec = { version = "1.6", optional = true }

150
README.md
View File

@ -1,6 +1,150 @@
# 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))
is `1.47`
`requestty` (request-tty) is an easy-to-use collection of interactive
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`

View File

@ -1,8 +1,14 @@
[package]
name = "requestty-macro"
version = "0.0.1"
version = "0.1.0"
authors = ["Lutetium Vanadium"]
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]
proc-macro = true

View File

@ -1,8 +1,7 @@
//! This crate is the declaration of the [`questions!`] macro. It should not be used directly. Use
//! [`requestty`] instead.
//!
//! [`requestty`]: https://github.com/lutetium-vanadium/requestty
// TODO: [`requestty`]: https://crates.io/crates/requestty
//! [`requestty`]: https://crates.io/crates/requestty
extern crate proc_macro;
use proc_macro::TokenStream;

View File

@ -1,8 +1,16 @@
[package]
name = "requestty-ui"
version = "0.0.1"
version = "0.1.0"
authors = ["Lutetium Vanadium"]
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]
bitflags = "1.2"

View File

@ -6,7 +6,7 @@
//! 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.
//!
//! [`requestty`]: https://github.com/lutetium-vanadium/requestty
//! [`requestty`]: https://crates.io/crates/requestty
//!
//! # Backends
//!
@ -15,7 +15,6 @@
//! - [`termion`](https://crates.io/crates/termion)
//!
//! The different backends can be enabled using the features of the same name.
// TODO: [`requestty`]: https://crates.io/crates/requestty
#![deny(
missing_docs,
missing_debug_implementations,

View File

@ -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));
}