Rustのtui-rsライブラリに入門してみた

はじめに

この記事では、「Rustのtui-rsライブラリの導入の仕方」について書いています。

Rustを色々勉強しており、色々なクレート(ライブラリ)を触ってみているので記事を書いてみました。

自分に向けた備忘録でもありますが、「Rustのtui-rsライブラリって何?」や「ちょっと触ってみたい」な人の一助になれば嬉しいです。

前提(環境)

以下の環境、フォルダ構成で実験をしていきます。

そもそもtuiとは何か

tui(TUI)とは Text User Interfaceの略で、テキストベースのユーザーインターフェースのことです。

CUIGUIの中間のような感じで、CUIのようにコマンドラインからコマンドを打ち込むではないですが、GUIのように動画や画像、音声データを結びつけたりすることもできません。

TUIは一般的なテキスト端末で表示できる記号や文字だけで画面を構成されています。

tui-rsとは

tui-rsはRustでTUIを簡単に作ったり扱うことのできるライブラリです。

導入して実際に動かしてみるまで

tui-rsのドキュメントに導入の仕方があるので、それに沿って書いていきます。

まずはCargo.tomlに依存関係を追加します。

...(略)...

[dependencies]
tui = "0.19"
crossterm = "0.25"

ここではバックエンドにcrosstermを選んでいますが、termionや他のものにすることも可能のようです。(ここではその話はせずcrosstermで進めていきます)

次に、main.rsにコードを書いていきましょう

use std::{io, thread, time::Duration};
use tui::{
    backend::CrosstermBackend,
    widgets::{Widget, Block, Borders},
    layout::{Layout, Constraint, Direction},
    Terminal
};
use crossterm::{
    event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode},
    execute,
    terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen},
};

fn main() -> Result<(), io::Error> {
    // setup terminal
    enable_raw_mode()?;
    let mut stdout = io::stdout();
    execute!(stdout, EnterAlternateScreen, EnableMouseCapture)?;
    let backend = CrosstermBackend::new(stdout);
    let mut terminal = Terminal::new(backend)?;

    terminal.draw(|f| {
        let size = f.size();
        let block = Block::default()
            .title("Block")
            .borders(Borders::ALL);
        f.render_widget(block, size);
    })?;

    thread::sleep(Duration::from_millis(5000));

    // restore terminal
    disable_raw_mode()?;
    execute!(
        terminal.backend_mut(),
        LeaveAlternateScreen,
        DisableMouseCapture
    )?;
    terminal.show_cursor()?;

    Ok(())
}

これも公式のドキュメントのままです。ターミナルに描画して5秒ほど待って終了するという内容のコードです。

これでcargo runで実行させてみましょう

非常に寂しい感じですが(笑)、無事表示することが出来ました。

おわりに

「Rustのtui-rsライブラリの導入の仕方」について解説しました。

ターミナル操作系のライブラリはtui-rs以外のものも色々あるそうなので他のものも使ってみていきたいと思います。

さいごに、記事を書く上で参考にしたサイトのリンクを以下に掲載します。合わせて読んでいただくと良いかと思います。

docs.rs

blog.fascode.net