Expand description
Β§π¦ rusty_repl
A lightweight, modular framework for building interactive REPLs in Rust β with clean prompts, terminal isolation, and customisable input handling.
Β§β¨ Features
- π₯οΈ Alternate screen mode β clean, isolated terminal workspace
- π¬ Custom prompts β easily define your own
Promptstyle viaCleanPrompt - β‘ Input handling loop β powered by
reedline - π§Ή Automatic cleanup β restores cursor, title, and screen on exit
- π¨ Keyword highlighting β built-in highlighter with custom color schemes (
KeywordStyle) - π§© Extensible design β drop in new highlighters, prompts, or REPL logic
- π οΈ Config builder β safely construct REPL configuration with
ReplConfig::new().with_title(...).with_prompt(...).with_kw_style(...)
Β§π Quick Start
Add to your Cargo.toml:
[dependencies]
rusty_repl = "0.3.0"Then in your project:
β
use rusty_repl::Repl;
fn input_handler(cmd: String) -> bool {
match cmd.as_str() {
"e" | "q" | "quit" | "exit" => {
return true;
}
val => println!("{val}"),
};
false
}
fn main() {
// Use default configuration
let repl_manager = Repl::new();
// Run REPL loop
let _ = repl_manager.run(run);
}Or
β
use rusty_repl::{CleanPrompt, Color, DefaultPromptSegment, KeywordStyle, Repl, ReplConfig};
fn input_handler(cmd: String) -> bool {
match cmd.as_str() {
"e" | "q" | "quit" | "exit" => {
return true;
}
val => println!("{val}"),
};
false
}
fn main() {
// Configure keywords
let ks = KeywordStyle::new(
vec!["ls", "pwd", "cd", "e", "q", "quit", "exit"],
Color::Red,
);
// Configure prompt
let default_prompt = CleanPrompt::from(
DefaultPromptSegment::Basic("β―β―β― ".to_string()),
DefaultPromptSegment::Empty,
);
// Build REPL configuration
let cfg = ReplConfig::new("REPL")
.with_kw_style(ks)
.with_prompt(default_prompt);
let repl_manager = Repl::from(cfg);
// Run REPL loop
let _ = repl_manager.run(run);
}This opens an alternate terminal screen with a minimal prompt.
Type exit to leave the session.
Β§π§© Architecture
| Module | Responsibility |
|---|---|
repl::input | Handles user input with reedline |
repl::terminal | Manages terminal (alternate screen, cursor, cleanup) |
repl::prompt | Defines a cleaner, customisable prompt |
repl::highlighter | Highlights configured keywords during input |
repl::style | Configures keyword styles (colors, word list) |
repl::repl | Connects all components into a cohesive REPL session |
Β§π§ Future Enhancements
- πΎ Persistent command history
- π§ Syntax-aware input completion
- π Theming and multi-color highlighting
Β§π License
Licensed under the MIT License
Β§π Changelog
Β§0.3.0
- Introduced
ReplConfigbuilder with.with_title(),.with_prompt(),.with_kw_style() - REPL prompt now uses
Arc<dyn Prompt>to avoid ownership/move issues - InputHandler stores the prompt internally; run no longer requires external prompt
- Updated all modules to consume
Arc<ReplConfig>instead of cloning individual fields - Documentation updated for builder pattern, prompt handling, and
Arcusage - Example code updated to reflect new API
Β§0.2.0
- Added keyword highlighting support
- Introduced
KeywordHighlighterfor basic keyword-based styling. - Exposed
KeywordStyleas part of the public API. - Updated
Repl::newto accept an optionalKeywordStyleargument.
StructsΒ§
- Clean
Prompt - A simplified
Promptimplementation that suppresses Reedlineβs extra visual indicators while keeping your custom prompt text. - Keyword
Style - Represents a set of keywords and the style used to highlight them.
- Repl
- Top-level REPL manager that orchestrates terminal setup and user input.
- Repl
Config - Configuration for the REPL (Read-Eval-Print Loop).
EnumsΒ§
- Color
- A color is one specific type of ANSI escape code, and can refer to either the foreground or background color.
- Default
Prompt Segment - A struct to control the appearance of the left or right prompt in a
DefaultPrompt