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;
55mod inputs;
56mod responder;
57pub mod sources;
58
59// Re-export core types
60pub use chain::InputChain;
61pub use collector::{InputCollector, InputSourceKind, ResolvedInput};
62pub use error::InputError;
63pub use inputs::{Inputs, MissingInput};
64pub use responder::{
65    reset_default_prompt_responder, set_default_prompt_responder, PromptContext, PromptKind,
66    PromptResponder, PromptResponse, ScriptedResponder,
67};
68
69// Re-export sources at crate root for convenience
70pub use sources::{
71    read_if_piped, ArgSource, ClipboardSource, DefaultSource, EnvSource, FlagSource, StdinSource,
72};
73
74#[cfg(feature = "editor")]
75pub use sources::{EditorRunner, EditorSource, MockEditorResult, MockEditorRunner};
76
77#[cfg(feature = "simple-prompts")]
78pub use sources::{ConfirmPromptSource, MockTerminal, TerminalIO, TextPromptSource};
79
80#[cfg(feature = "inquire")]
81pub use sources::{
82    InquireConfirm, InquireEditor, InquireMultiSelect, InquirePassword, InquireSelect, InquireText,
83};
84
85// Re-export mock types for testing
86pub use env::{MockClipboard, MockEnv, MockStdin};
87
88// Re-export process-global default reader controls (used by test harnesses)
89pub use env::{
90    reset_default_clipboard_reader, reset_default_stdin_reader, set_default_clipboard_reader,
91    set_default_stdin_reader, DefaultClipboard, DefaultStdin,
92};