| # forge_select |
| |
| A centralized crate for user interaction prompts using dialoguer. |
| |
| ## Purpose |
| |
| This crate provides a unified interface for terminal user interactions across the forge codebase. It encapsulates all direct dependencies on `dialoguer`, ensuring no other crates need to depend on it directly. |
| |
| ## Features |
| |
| - **Select prompts**: Choose from a list of options |
| - **Confirm prompts**: Yes/no questions |
| - **Input prompts**: Text input from user |
| - **Multi-select prompts**: Choose multiple options from a list |
| - **Consistent theming**: All prompts use a unified color scheme |
| - **Error handling**: Graceful handling of user interruptions |
| |
| ## Usage |
| |
| ### Select from options |
| |
| ```rust |
| use forge_select::ForgeSelect; |
|
|
| let options = vec!["Option 1", "Option 2", "Option 3"]; |
| let selected = ForgeSelect::select("Choose an option:", options) |
| .with_starting_cursor(1) |
| .prompt()?; |
| ``` |
| |
| ### Confirm (yes/no) |
|
|
| ```rust |
| use forge_select::ForgeSelect; |
| |
| let confirmed = ForgeSelect::confirm("Are you sure?") |
| .with_default(true) |
| .prompt()?; |
| ``` |
|
|
| ### Text input |
|
|
| ```rust |
| use forge_select::ForgeSelect; |
| |
| let name = ForgeSelect::input("Enter your name:") |
| .allow_empty(false) |
| .with_default("John") |
| .prompt()?; |
| ``` |
|
|
| ### Multi-select |
|
|
| ```rust |
| use forge_select::ForgeSelect; |
| |
| let options = vec!["Red", "Green", "Blue"]; |
| let selected = ForgeSelect::multi_select("Choose colors:", options) |
| .prompt()?; |
| ``` |
|
|
| ## Design |
|
|
| ### Builder Pattern |
|
|
| All prompt types use a builder pattern for configuration: |
| - Create the builder with `ForgeSelect::select()`, `ForgeSelect::confirm()`, etc. |
| - Configure options with `.with_*()` methods |
| - Execute with `.prompt()` |
|
|
| ### Ownership vs Clone |
|
|
| Two variants for select operations: |
| - `select()`: Requires `Clone` for options, useful when you need the list after selection |
| - `select_owned()`: Takes ownership, no `Clone` required, more efficient |
|
|
| ### Theme |
|
|
| All prompts use a consistent `ColorfulTheme` from dialoguer, providing a unified look across the application. |
|
|
| ## Integration |
|
|
| This crate is used by: |
| - `forge_main`: For CLI user interactions |
| - `forge_infra`: For implementing the `UserInfra` trait |
|
|
| No other crates should depend on `dialoguer` directly - use this crate instead. |
|
|