7 个版本
0.1.6 | 2022年4月21日 |
---|---|
0.1.5 | 2022年4月19日 |
#812 in 命令行界面
34 每月下载量
14KB
178 行
Rustea
Rustea 是一个基于 Elm 架构的 Rust 容易使用的 TUI 库。这是对 Go 的 Tea 的重新实现,由 TJ Holowaychuk 创建。
特性
- 最小化和易于使用的 API。
- 不断增长的视图辅助程序集合。
- 自动多线程命令处理。
- 跨平台,归功于
crossterm
。 - 备受赞誉的 Elm 架构。
安装和文档
通过在您的 Cargo.toml
依赖项中放入 rustea = "0.1.5"
来安装。
文档可以在 docs.rs 上找到。
快速入门
一个示例演示了网站长度检查器,具有批处理异步命令。
use crossterm::event::KeyModifiers;
use rustea::{
command,
crossterm::event::{KeyCode, KeyEvent},
view_helper::input::Input,
App, Command, Message,
};
struct Model {
url_input: Input,
website_lengths: Vec<usize>,
}
impl App for Model {
fn update(&mut self, msg: Message) -> Option<Command> {
if let Some(key_event) = msg.downcast_ref::<KeyEvent>() {
if let KeyModifiers::CONTROL = key_event.modifiers {
if let KeyCode::Char('c') = key_event.code {
return Some(Box::new(command::quit));
}
}
match key_event.code {
KeyCode::Enter => {
let url = self.url_input.buffer();
self.url_input.clear();
// make 3 requests to demonstrate command batching
let commands = vec![
make_request_command(url.clone()),
make_request_command(url.clone()),
make_request_command(url),
];
return Some(command::batch(commands));
}
_ => self.url_input.on_key_event(*key_event),
}
} else if let Some(len) = msg.downcast_ref::<WebsiteLengthMessage>() {
self.website_lengths.push(len.0);
}
None
}
fn view(&self) -> String {
let mut out = format!(
"Website URL (press enter when done): {}",
self.url_input.buffer()
);
for (i, len) in self.website_lengths.iter().enumerate() {
out.push_str(&format!("\nHit {} length: {}", i, len));
}
out
}
}
struct WebsiteLengthMessage(usize);
fn make_request_command(url: String) -> Command {
Box::new(move || {
// It's okay to block since commands are multi threaded
let website_len = reqwest::blocking::get(url).unwrap().bytes().unwrap().len();
Some(Box::new(WebsiteLengthMessage(website_len)))
})
}
fn main() {
rustea::run(Model {
url_input: Input::new(),
website_lengths: Vec::new(),
})
.unwrap();
}
更多示例
有关更多示例,请参阅示例目录。
依赖项
~1.3–10MB
~82K SLoC