6 个版本
0.0.7 | 2019 年 8 月 25 日 |
---|---|
0.0.6 | 2018 年 9 月 29 日 |
0.0.4 | 2016 年 9 月 11 日 |
0.0.3 |
|
0.0.1 | 2016 年 6 月 19 日 |
#81 in #interactive
每月 138 次下载
在 4 crates 中使用
18KB
291 行代码(不含注释)
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 中实现。
多线程
壳实例本身不能在线程之间共享,需要克隆。壳只有在其包装的数据可以克隆时才可克隆。但是,如果包装的数据是一个(例如)围绕 Arc
的 Sync+Send
值,则可以轻松共享。
待定...
在文档和 examples 目录中提供了额外的示例
依赖项
~2–3MB
~35K SLoC