rusty_repl 0.3.0

REPL library with customisable prompts and clean terminal management.
Documentation

๐Ÿฆ€ 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 Prompt style via CleanPrompt
  • โšก 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 ReplConfig builder 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 Arc usage
  • Example code updated to reflect new API

0.2.0

  • Added keyword highlighting support
  • Introduced KeywordHighlighter for basic keyword-based styling.
  • Exposed KeywordStyle as part of the public API.
  • Updated Repl::new to accept an optional KeywordStyle argument.