5 个版本

0.2.1 2021 年 1 月 18 日
0.2.0 2021 年 1 月 18 日
0.1.2 2021 年 1 月 16 日
0.1.1 2020 年 12 月 26 日
0.1.0 2020 年 12 月 4 日

#27 in #clear

24 每月下载

MIT 许可证

38KB
627 行代码(不包括注释)

Shelp

shelp(sh help) 是一个库,用于创建功能强大且外观良好的 REPL,无需担心通用的设置和与终端的交互。它提供了一个可配置的界面,允许您只需处理 REPL 的语言特定部分。

repl 处理了特殊的 2 个命令

  • clear - 清除屏幕
  • exit - 退出 这些可以通过 repl.set_clear_keyword()repl.set_exit_keyword() 分别更改。任何其他特殊命令都可以在执行循环中处理。

如何使用

取一些只是打印输入的程序

use shelp::{Repl, Color};
let repl = Repl::newd("> ", ". ", None);
let mut repl = repl.iter(Color::Green);

// Now 'claer' clears the screen instead of 'clear'.
repl.set_clear_keyword("claer");

for command in repl {
    // Other special commands can be handled here
    if command == "my_special_command" {
        println!("Special command triggered!");
        continue;
    }

    // <Do something>
}

这里没有指定 LangInterface,因此默认使用。可以通过实现特性和将其作为泛型类型参数传递来指定 LangInterface

use std::io::{self, prelude::*};
use shelp::{Repl, Color, LangInterface, Result};
// You can use any library, but currently only crossterm is used in the library for terminal.
use crossterm::style::Colorize;

struct MyLangInterface;
// We want to override the linting so numbers are coloured, but we don't have a specific way of
// getting the indentation, so we do not override that.
impl LangInterface for MyLangInterface {
    fn print_line(_: &mut io::Stdout, lines: &[String], index: usize) -> Result<()> {
        // NOTE this is simple linting and has no multi-line context. For more information on
        // the reason all lines are given, see [`LangInterface::print_line`]
        for i in lines[index].chars() {
            if i.is_numeric() {
                print!("{}", i.magenta());
            } else {
                print!("{}", i);
            }
        }
        Ok(())
    }
}

// Use a particular capacity
let mut repl = Repl::<MyLangInterface>::with_capacity("> ", ". ", 128, None);

loop {
    // You can have dynamic colours if you don't use the iterator. It also allows you to use the
    // errors instead of them being ignored.
    // NOTE here it is unwrapped, but it should be dealt with in a better way.
    let command = repl.next(Color::Blue).unwrap();

    // <Do something>
}

依赖关系

~2MB
~36K SLoC