standout-input 7.7.0

Declarative input collection for CLI applications
Documentation
# standout-input

Declarative input collection for CLI applications.

## Overview

`standout-input` provides a unified way to acquire user input from multiple sources—CLI arguments, stdin, environment variables, editors, and interactive prompts—with automatic fallback chains.

```rust
use standout_input::{InputChain, ArgSource, StdinSource, EditorSource};

// Try argument first, then piped stdin, then open editor
let message = InputChain::<String>::new()
    .try_source(ArgSource::new("message"))
    .try_source(StdinSource::new())
    .try_source(EditorSource::new())
    .resolve(&matches)?;
```

## Features

- **Declarative chains** - Define fallback sequences without imperative logic
- **Pluggable sources** - Arg, stdin, env, clipboard, editor, prompts
- **Validation** - Chain-level and source-level validation with retry support
- **Testable** - All sources accept mock implementations for CI-safe testing
- **Minimal deps** - Core has ~2 dependencies; heavy features are opt-in

## Feature Flags

| Feature          | Default | Dependencies       | Provides                                  |
| ---------------- | ------- | ------------------ | ----------------------------------------- |
| `editor`         | Yes     | tempfile, which    | `EditorSource`                            |
| `simple-prompts` | Yes     | none               | `TextPromptSource`, `ConfirmPromptSource` |
| `inquire`        | No      | inquire (~29 deps) | Rich TUI prompts                          |

### Minimal Build

```toml
[dependencies]
standout-input = { version = "0.1", default-features = false }
```

### Full Feature Set

```toml
[dependencies]
standout-input = { version = "0.1", features = ["inquire"] }
```

## Usage

### Basic Chain

```rust
use standout_input::{InputChain, ArgSource, StdinSource, DefaultSource};

let chain = InputChain::<String>::new()
    .try_source(ArgSource::new("message"))
    .try_source(StdinSource::new())
    .default("default message".to_string());

let value = chain.resolve(&matches)?;
```

### With Validation

```rust
let chain = InputChain::<String>::new()
    .try_source(ArgSource::new("email"))
    .try_source(TextPromptSource::new("Email: "))
    .validate(|s| s.contains('@'), "Must be a valid email");
```

### Testing with Mocks

```rust
use standout_input::{StdinSource, MockStdin, EnvSource, MockEnv};

// Simulate piped input
let source = StdinSource::with_reader(MockStdin::piped("test content"));

// Simulate terminal (no piped input)
let source = StdinSource::with_reader(MockStdin::terminal());

// Simulate environment variable
let env = MockEnv::new().with_var("TOKEN", "secret");
let source = EnvSource::with_reader("TOKEN", env);
```

## Available Sources

### Non-Interactive (always available)

| Source             | Type     | Description                       |
| ------------------ | -------- | --------------------------------- |
| `ArgSource`        | `String` | CLI argument                      |
| `FlagSource`       | `bool`   | CLI flag                          |
| `StdinSource`      | `String` | Piped stdin (skipped if terminal) |
| `EnvSource`        | `String` | Environment variable              |
| `ClipboardSource`  | `String` | System clipboard                  |
| `DefaultSource<T>` | `T`      | Fallback value                    |

### Editor (`editor` feature, default)

| Source         | Type     | Description           |
| -------------- | -------- | --------------------- |
| `EditorSource` | `String` | Opens $VISUAL/$EDITOR |

### Simple Prompts (`simple-prompts` feature, default)

| Source                | Type     | Description      |
| --------------------- | -------- | ---------------- |
| `TextPromptSource`    | `String` | Basic text input |
| `ConfirmPromptSource` | `bool`   | Yes/no prompt    |

### Inquire (`inquire` feature)

| Source                  | Type     | Description            |
| ----------------------- | -------- | ---------------------- |
| `InquireText`           | `String` | Text with autocomplete |
| `InquireConfirm`        | `bool`   | Polished yes/no        |
| `InquireSelect<T>`      | `T`      | Single selection       |
| `InquireMultiSelect<T>` | `Vec<T>` | Multiple selection     |
| `InquirePassword`       | `String` | Masked input           |
| `InquireEditor`         | `String` | Editor with preview    |

## Documentation

- [Introduction to Input]docs/guides/intro-to-input.md - Getting started guide
- [Backends]docs/topics/backends.md - Detailed backend documentation and custom implementations

## License

MIT