#elm #architecture #off #tui #command #crossterm #view

rustea

一个基于 Elm 架构的 Rust 容易使用的 TUI 库。

7 个版本

0.1.6 2022年4月21日
0.1.5 2022年4月19日

#812 in 命令行界面

34 每月下载量

MIT 许可证

14KB
178

Rustea

Rustea 是一个基于 Elm 架构的 Rust 容易使用的 TUI 库。这是对 Go 的 Tea 的重新实现,由 TJ Holowaychuk 创建。

特性

  • 最小化和易于使用的 API。
  • 不断增长的视图辅助程序集合。
  • 自动多线程命令处理。
  • 跨平台,归功于 crossterm
  • 备受赞誉的 Elm 架构。

https://user-images.githubusercontent.com/103537080/163859892-3e9364ba-395d-4f4a-8c8c-984b8bea2abf.mov

安装和文档

通过在您的 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