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 次下载

GPL-3.0 或更新版

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