9 个稳定版本 (4 个主要版本)
5.2.1 | 2022 年 11 月 5 日 |
---|---|
5.2.0 | 2022 年 11 月 4 日 |
4.1.0 | 2022 年 10 月 31 日 |
3.0.0 | 2022 年 10 月 30 日 |
0.1.0 | 2022 年 10 月 25 日 |
#526 在 命令行界面
每月 30 次下载
46KB
1K SLoC
rubble_tea
rubble_tea 是一个类似于 golang's bubbletea 的 Rust TUI 框架。与提供小部件和样式的不同包的 bubbletea 不同,rubble_tea 在一个单独的包中提供一切。
教程
rubble_tea 程序通常由两个结构组成
- 事件结构用于描述事件,应该实现 Event 特性
- 模型结构用于存储、修改和显示程序的数据。它应该实现 Model 特性
事件
Event 特性包含 2 个方法
fn from_system_event(se: SystemEvent) -> Self;
fn to_system_event(&self) -> Option<SystemEvent>;
from_system_event
用于编码系统事件。由于系统事件应该始终编码,因此此函数应始终返回一个有效的事件。to_system_event
用于解码系统事件。由于并非所有事件都包含系统事件,因此此函数可以返回 None
。事件还应该是可克隆和可比较的。值得一提的是,SystemEvent
枚举实现了 Event 特性。这意味着如果程序只想处理系统事件,它不需要创建自己的事件结构。
示例
事件通常看起来像这样
#[derive(Eq, PartialEq, Clone)]
pub enum MyEvent {
Se(SystemEvent),
MyCustomEvent,
}
impl Event for MyEvent {
fn from_system_event(se: SystemEvent) -> Self {
MyEvent::Se(se)
}
fn to_system_event(&self) -> Option<SystemEvent> {
match self {
MyEvent::Se(x) => Some(x.clone()),
_ => None,
}
}
}
模型
Model
特性包含 2 个方法
pub trait Model<E: Event> {
fn update(&mut self, e: &E) -> Vec<Box<dyn FnOnce() -> E + Send + 'static>>;
fn view(&self) -> String;
}
update 方法负责根据接收到的事件修改模型,并返回一个闭包,该闭包返回一个新事件。视图方法负责将给定的模型转换为字符串。将显示相同的字符串。
示例
模型通常看起来像这样
struct MyModel(i32);
impl Model<SystemEvent> for MyModel {
fn update(
&mut self,
e: &SystemEvent,
) -> Vec<Box<dyn FnOnce() -> SystemEvent + Send + 'static>> {
match e {
SystemEvent::KeyPress(Key::Char('+')) => self.0 += 1,
SystemEvent::KeyPress(Key::Char('-')) => self.0 -= 1,
_ => (),
};
if self.0 < 0 || self.0 > 100 {
vec![Box::new(|| SystemEvent::Quit)]
} else {
vec![]
}
}
fn view(&self) -> String {
if self.0 < 0 || self.0 > 100 {
"Out of range!".to_string()
} else {
format!("{}", self.0)
}
}
}
依赖关系
~175KB