3 releases (breaking)
Uses new Rust 2024
| 0.3.0 | Oct 13, 2025 |
|---|---|
| 0.2.0 | Oct 12, 2025 |
| 0.1.0 | Oct 12, 2025 |
#10 in #interactive-repl
36KB
308 lines
๐ฆ 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.
Dependencies
~8โ25MB
~338K SLoC