Skip to main content

standout_input/
lib.rs

1//! Declarative input collection for CLI applications.
2//!
3//! `standout-input` provides a unified way to acquire user input from multiple
4//! sources—CLI arguments, stdin, environment variables, editors, and interactive
5//! prompts—with automatic fallback chains.
6//!
7//! # Quick Start
8//!
9//! ```ignore
10//! use standout_input::{InputChain, ArgSource, StdinSource, DefaultSource};
11//!
12//! // Try argument first, then piped stdin, then default
13//! let message = InputChain::<String>::new()
14//!     .try_source(ArgSource::new("message"))
15//!     .try_source(StdinSource::new())
16//!     .default("default message".to_string())
17//!     .resolve(&matches)?;
18//! ```
19//!
20//! # Features
21//!
22//! - **`editor`** (default) - Enable [`EditorCollector`] for editor-based input
23//! - **`simple-prompts`** (default) - Enable basic terminal prompts
24//! - **`inquire`** - Enable rich TUI prompts via the inquire crate
25//!
26//! # Architecture
27//!
28//! The crate is built around the [`InputCollector`] trait, which all input
29//! sources implement. Sources are composed into [`InputChain`]s that try each
30//! source in order until one provides input.
31//!
32//! ```text
33//! InputChain
34//! ├── ArgSource      → None (not provided)
35//! ├── StdinSource    → None (not piped)
36//! ├── EditorSource   → Some("user input") ← returns this
37//! └── DefaultSource  → (not reached)
38//! ```
39//!
40//! # Testing
41//!
42//! All sources accept mock implementations for testing:
43//!
44//! ```
45//! use standout_input::{StdinSource, env::MockStdin};
46//!
47//! // Test with simulated piped input
48//! let source = StdinSource::with_reader(MockStdin::piped("test input"));
49//! ```
50
51mod chain;
52mod collector;
53pub mod env;
54mod error;
55pub mod sources;
56
57// Re-export core types
58pub use chain::InputChain;
59pub use collector::{InputCollector, InputSourceKind, ResolvedInput};
60pub use error::InputError;
61
62// Re-export sources at crate root for convenience
63pub use sources::{
64    read_if_piped, ArgSource, ClipboardSource, DefaultSource, EnvSource, FlagSource, StdinSource,
65};
66
67#[cfg(feature = "editor")]
68pub use sources::{EditorRunner, EditorSource, MockEditorResult, MockEditorRunner};
69
70#[cfg(feature = "simple-prompts")]
71pub use sources::{ConfirmPromptSource, MockTerminal, TerminalIO, TextPromptSource};
72
73#[cfg(feature = "inquire")]
74pub use sources::{
75    InquireConfirm, InquireEditor, InquireMultiSelect, InquirePassword, InquireSelect, InquireText,
76};
77
78// Re-export mock types for testing
79pub use env::{MockClipboard, MockEnv, MockStdin};