#azure #sdk #iac #cloud-sdk #cloud

cloud_terrastodon_user_input

Helper functions for interacting with users in the terminal

24 releases (breaking)

Uses new Rust 2024

0.29.0 Nov 7, 2025
0.27.0 Sep 18, 2025
0.21.0 Jul 14, 2025

#656 in Command-line interface

Download history 98/week @ 2025-08-02 102/week @ 2025-08-09 130/week @ 2025-08-16 126/week @ 2025-08-23 89/week @ 2025-08-30 142/week @ 2025-09-06 262/week @ 2025-09-13 137/week @ 2025-09-20 69/week @ 2025-09-27 39/week @ 2025-10-04 37/week @ 2025-10-11 62/week @ 2025-10-18 38/week @ 2025-10-25 27/week @ 2025-11-01 18/week @ 2025-11-08 18/week @ 2025-11-15

103 downloads per month
Used in 14 crates (11 directly)

LiLiQ-R-1.1

35KB
661 lines

cloud_terrastodon_user_input

English

Helper functions for interacting with users in the terminal.

This crate provides convenient functions for prompting the user for input, including:

  • Getting a single line of input.
  • Asking a yes/no question.
  • Allowing the user to pick one or many items from a list using fzf.

Prerequisites

This crate relies on fzf being installed on the system. Please refer to the fzf installation instructions for your operating system:

Française

Fonctions d'aide pour interagir avec les utilisateurs dans le terminal.

Ce crate fournit des fonctions pratiques pour demander l'avis de l'utilisateur, notamment :

  • Obtenir une seule ligne de saisie.
  • Poser une question par oui ou par non.
  • Permettre à l'utilisateur de choisir un ou plusieurs éléments d'une liste à l'aide de fzf.

Prérequis

Cette caisse dépend de l'installation de fzf sur le système. Veuillez vous référer aux instructions d'installation de fzf pour votre système d'exploitation :

Installation

cargo add cloud_terrastodon_user_input

Examples / Exemples

are_you_sure.rs

use cloud_terrastodon_user_input::are_you_sure;

fn main() -> eyre::Result<()> {
    if are_you_sure("This will delete the universe. Are you sure you want to proceed?".to_string())? {
        println!("Proceeding!");
    } else {
        println!("Action cancelled.");
    }

    Ok(())
}

pick_many_nouns.rs

use cloud_terrastodon_user_input::FzfArgs;
use cloud_terrastodon_user_input::pick_many;

pub fn main() -> eyre::Result<()> {
    let nouns = vec!["dog", "cat", "house", "pickle", "mouse"];
    let chosen = pick_many(FzfArgs {
        choices: nouns,
        header: Some("Press tab to select entries".to_string()),
        prompt: Some("Pick some nouns >".to_string()),
        ..Default::default()
    })?;

    println!("You chose {:?}", chosen);

    Ok(())
}

starting_search.rs

use cloud_terrastodon_user_input::FzfArgs;
use cloud_terrastodon_user_input::pick;

pub fn main() -> eyre::Result<()> {
    let nouns = vec!["dog", "cat", "house", "pickle", "mouse"];
    let chosen = pick(FzfArgs {
        choices: nouns,
        header: Some("Pick a noun".to_string()),
        query: Some("ouse".to_string()),
        ..Default::default()
    })?;
    println!("You chose {}", chosen);

    Ok(())
}

read_line.rs

use cloud_terrastodon_user_input::read_line;
use std::io::Write;

#[tokio::main]
async fn main() -> eyre::Result<()> {
    print!("Enter your name: ");
    std::io::stdout().flush()?;
    let user_input = read_line().await?;
    println!("Hello, {}!", user_input);

    Ok(())
}

pick_a_noun.rs

use cloud_terrastodon_user_input::FzfArgs;
use cloud_terrastodon_user_input::pick;

pub fn main() -> eyre::Result<()> {
    let nouns = vec!["dog", "cat", "house", "pickle", "mouse"];
    let chosen = pick(FzfArgs {
        choices: nouns,
        header: Some("Pick a noun".to_string()),
        ..Default::default()
    })?;
    println!("You chose {}", chosen);

    Ok(())
}

pick_a_path.rs

use cloud_terrastodon_user_input::Choice;
use cloud_terrastodon_user_input::FzfArgs;
use cloud_terrastodon_user_input::pick;

pub fn main() -> eyre::Result<()> {
    let mut choices = Vec::new();
    let mut dir = std::fs::read_dir(".")?;
    while let Some(entry) = dir.next() {
        let entry = entry?;
        choices.push(entry);
    }

    let chosen = pick(FzfArgs {
        choices: choices
            .into_iter()
            .map(|entry| Choice {
                key: entry.path().display().to_string(), // the value shown to the user
                value: entry, // the inner value we want to have after the user picks
            })
            .collect(),
        header: Some("Pick a path".to_string()),
        ..Default::default()
    })?;

    println!("You chose {}", chosen.file_name().to_string_lossy());

    Ok(())
}

prompt_line.rs

use cloud_terrastodon_user_input::prompt_line;

#[tokio::main]
async fn main() -> eyre::Result<()> {
    let user_input = prompt_line("Enter your name: ").await?;
    println!("Hello, {}!", user_input);

    Ok(())
}

multiline.rs

use cloud_terrastodon_user_input::pick_many;

pub fn main() -> eyre::Result<()> {
    let choices = vec![
        "First\nSecond\nThird",
        "A\nB\nC",
        "IMPORT BRUH\nDO THING\nWOOHOO!",
        "single item",
        "another single item",
    ];
    let chosen = pick_many(choices)?;
    println!("You chose: {chosen:#?}");
    Ok(())
}

Dependencies

~12–26MB
~349K SLoC