6 个版本

0.0.7 2019 年 8 月 25 日
0.0.6 2018 年 9 月 29 日
0.0.4 2016 年 9 月 11 日
0.0.3 2016 年 8 月 29 日
0.0.1 2016 年 6 月 19 日

#81 in #interactive

Download history 44/week @ 2024-03-11 39/week @ 2024-03-18 16/week @ 2024-03-25 100/week @ 2024-04-01 19/week @ 2024-04-08 28/week @ 2024-04-15 33/week @ 2024-04-22 25/week @ 2024-04-29 18/week @ 2024-05-06 32/week @ 2024-05-13 31/week @ 2024-05-20 68/week @ 2024-05-27 30/week @ 2024-06-03 25/week @ 2024-06-10 33/week @ 2024-06-17 35/week @ 2024-06-24

每月 138 次下载
4 crates 中使用

MIT 许可证

18KB
291 行代码(不含注释)

License Build Status Coverage Status Crates.io

shrust

Rust 库,用于创建交互式命令行壳

文档

版权 © 2019 Pierre-Henri Symoneaux

本软件分发时不附带任何保证
有关更多信息,请参阅 LICENSE.txt 文件。

此项目目前正在开发中,API 应被视为不稳定。一旦达到初步的稳定性,我将开始编写文档并将软件发布到 crates.io

如何使用

包含

通常,您会将库作为依赖项包含到项目中。为此,请将以下行添加到您的 Cargo.toml 文件中

[dependencies]
shrust = "0.0.7"

基本用法

让我们看看示例 dummy.rs

extern crate shrust;
use shrust::{Shell, ShellIO};
use std::io::prelude::*;

fn main() {
    let mut shell = Shell::new(());
    shell.new_command_noargs("hello", "Say 'hello' to the world", |io, _| {
        writeln!(io, "Hello World !!!")?;
        Ok(())
    });

    shell.run_loop(&mut ShellIO::default());
}

此程序的输出将是

λ cargo run --example dummy
     Running `target\debug\examples\dummy.exe`
>help
 hello    :  Say 'hello' to the world
 help     :  Print this help
 history  :  Print commands history or run a command from it
 quit     :  Quit
>hello
Hello World !!!
>quit

附加数据

您可以将数据附加到壳中,供命令使用,如 data.rs 中所示

let v = Vec::new();
let mut shell = Shell::new(v);
shell.new_command("push", "Add string to the list", 1, |io, v, s| {
    writeln!(io, "Pushing {}", s[0])?;
    v.push(s[0].to_string());
    Ok(())
});
shell.new_command_noargs("list", "List strings", |io, v| {
    for s in v {
        writeln!(io, "{}", s)?;
    }
    Ok(())
});

shell.run_loop(&mut ShellIO::default());

输出

λ cargo run --example dummy
     Running `target\debug\examples\dummy.exe`
>help
 help     :  Print this help
 history  :  Print commands history or run a command from it
 list     :  List strings
 push     :  Add string to the list
 quit     :  Quit
>push foo
Pushing foo
>push bar
Pushing bar
>list
foo
bar
>quit

使用自定义 I/O

在先前的示例中,壳的循环是以以下方式运行的

shell.run_loop(&mut ShellIO::default());

ShellIO::default() 返回 stdin/stdout I/O。

可以创建一个 ShellIO 实例,绕过用户定义的 I/O。例如,要将 Shell 连接到套接字,ShellIO 应以以下方式创建

let mut io = ShellIO::new_io(sock);

其中 sock 是套接字,然后可以启动壳

shell.run_loop(&mut io);

这在示例 socket.rs 中实现。

默认处理程序

默认情况下,当找不到命令时,评估返回一个 UnknownCommand 错误。可以通过提供自定义默认处理程序来自定义此行为,以便在找不到命令时调用。

let mut shell = Shell::new(());
shell.set_default(|io, _, cmd| {
    writeln!(io, "Hello from default handler !!! Received: {}", cmd)?;
    Ok(())
});
shell.run_loop(&mut ShellIO::default());

输出

λ cargo run --example default
     Running `target\debug\examples\default.exe`
>foo
Hello from default handler !!! Received: foo
>quit

这在示例 default.rs 中实现。

多线程

壳实例本身不能在线程之间共享,需要克隆。壳只有在其包装的数据可以克隆时才可克隆。但是,如果包装的数据是一个(例如)围绕 ArcSync+Send 值,则可以轻松共享。

待定...

在文档和 examples 目录中提供了额外的示例

依赖项

~2–3MB
~35K SLoC