18 releases (5 breaking)

0.5.8 Apr 6, 2024
0.5.7 Jan 29, 2024
0.5.4 Nov 29, 2023

#414 in Command-line interface

Download history 14/week @ 2024-01-26 13/week @ 2024-02-23 5/week @ 2024-03-01 4/week @ 2024-03-08 1/week @ 2024-03-15 5/week @ 2024-03-29 123/week @ 2024-04-05

132 downloads per month

MPL-2.0 license

85KB
2K SLoC

may clack

this is a rust port of the npm package @clack/prompts.

wip

this project is still a work in progress

the api will likely change still


lib.rs:

This is a rust port of https://www.npmjs.com/package/@clack/prompts

Setup

You can setup the start and end of a prompt session with the macros intro! and outro!, respectively

use may_clack::{intro, outro};

intro!("intro");
// do stuff
outro!("outro");

Cancel

When the user cancels a question, you can use the cancel! utility to provide a cancellation message.

When cancelled the will return a error::ClackError::Cancelled, or you can check if it was cancelled using the traits::IsCancel trait extension.

All input types that can return a Cancelled Err will also have the option to add a .cancel closure

use may_clack::{cancel, input, error::ClackError};

let text = input("todo").interact();
if let Err(ClackError::Cancelled) = text {
    cancel!("operation cancelled");
}
use may_clack::{cancel, input, traits::IsCancel};
let text = input("todo").interact();
if text.is_cancel() {
    cancel!("operation cancelled");
}

Info

If you want to write a message in a prompting session you can use the info!, warn! or err! utility.

use may_clack::{err, info, intro, outro, warn};

intro!("intro");
// do stuff
info!("info");
// do stuff
warn!("warn");
// do stuff
err!("err");
// do stuff
outro!("outro");

General

There are 6 components: input, confirm, select, multi_select, multi_input

Each of the input types returns a struct, that allows you to setup the prompt.
since every prompt needs a message the initial

To actually prompt the user after setting up you have to call .interact()

use may_clack::confirm;

let answer = confirm("Yes or No?").interact()?;

Components

Input

The input::Input component accepts a single line of text.

use may_clack::input;

let answer = input("what is the meaning of life?").initial_value("42").interact()?;
println!("{:?}", answer);

Confirm

The confirm::Confirm component accepts a yes or no answer.

use may_clack::confirm;

let answer = confirm("do you want to continue?").interact()?;
println!("answer {:?}", answer);

Select

The select::Select component allows the user to choose one value from a list of options.

use may_clack::select;

#[derive(Debug, Clone)]
enum Fruit {
    Mango,
    Peach,
    PassionFruit,
}

let fruit = select("pick a fruit")
    .option_hint(Fruit::Mango, "Mango", "The best one")
    .option(Fruit::Peach, "Peach")
    .option(Fruit::PassionFruit, "Passion fruit")
    .interact()?;
println!("fruit {:?}", fruit);

MultiSelect

The multi_select::MultiSelect component allows the user to choose multiple values from a list of options.

use may_clack::multi_select;

let toppings = multi_select("Choose your toppings")
    .option("fruits", "Dried fruits")
    .option("chocolate", "Chocolate chips")
    .option_hint("sauce", "Chocolate sauce", "it's warm")
    .interact()?;
println!("toppings {:?}", toppings);

MultiInput

The multi_input::MultiInput component accepts multiple lines of text.

use may_clack::multi_input;

let lines = multi_input("idk").interact()?;
println!("lines {:?}", lines);

Dependencies

~4–14MB
~144K SLoC