前回、機能毎に関数で切り出して細分化してみましたがよりRustぽくするためにモジュール化を行います。
モジュールとすることで関連するコードをまとめたり、アクセス範囲を狭めたり、処理内容を隠蔽することができます。
fn main
// AlternateScreenへ移行
// raw モードに移行
// イベント処理
fn handle_events
// イベントハンドラ
// match式でResultを処理
fn handle_key_events
// キー入力処理
// Ctrl や SHIFT等のコンビネーションキー処理
// Ctrlが押されている場合
// Ctrl + qが入力されたら
// raw モードを解除
// AlternateScreenから復帰
// アプリケーション終了処理
// 通常のキー入力処理
// 入力されたキーを画面出力
fn dbg_print_key_code
// 入力されたキーを画面出力
上記がソースコードのコメントを元にした大まかな機能の内容です。
大きく分けると画面の初期化と復旧、イベント処理の2つになります。
とりあえずこの2つでモジュールを作り、細かい機能を関数として定義してみます。
# 画面初期化
fn main
// AlternateScreenへ移行
// raw モードに移行
# イベントハンドラ
// イベント処理
fn handle_events
// イベントハンドラ
// match式でResultを処理
fn handle_key_events
// キー入力処理
// Ctrl や SHIFT等のコンビネーションキー処理
// Ctrlが押されている場合
// Ctrl + qが入力されたら
// 通常のキー入力処理
// 入力されたキーを画面出力
# 画面復旧
// raw モードを解除
// AlternateScreenから復帰
// アプリケーション終了処理
# 画面出力(デバック系)
fn dbg_print_key_code
// 入力されたキーを画面出力
上記を踏まえてモジュール化したコードが下記となります(中身は省略)。
modというキーワードがモジュールの単位となります。
モジュールの中に更にモジュールを作成することも可能で、下記ではevent_handlerモジュールの中にtestモジュールを作っています。
また、event_handlerモジュールの中でEventHandler 型を定義しています。
structは構造体のキーワードでカスタム型としてユーザによって自由に定義することができます。
impl EventHandlerによってこのカスタム型に関連した関数やメソッドを定義しています。
第一引数がselfの場合、メソッドとして扱われます。そうでない場合は関数として動作します。
// TUI関連
mod tui {
// 画面初期化
pub fn init_tui(&self) -> io::Result<()> {
Ok(())
}
// 画面復旧
pub fn end_tui(&self) -> io::Result<()> {
Ok(())
}
}
// イベントハンドラ
mod event_handler {
pub struct EventHandler {}
impl EventHandler {
// コンストラクタ
pub fn new() -> Self {}
// イベント処理
fn handle_events(&mut self);
// キー入力処理
fn handle_key_events(&mut self);
// イベントループ
pub fn run(&mut self);
}
mod test {
// 画面出力(デバック系)
fn dbg_print_key_code() {}
}
}
モジュールとすることで、モジュールの中にある関数はデフォルトでプライベートな関数になります。
pubキーワードを付与することでモジュールの外部へ公開することが可能です。
こうすることによりRustコードとして見やすくなりメンテナンス性も上がります。
main関数は下記のようになりました。
// イベントハンドラの読み込み
use crate::event_handler::EventHandler;
// use self::tui;
// main 関数
fn main() {
// 画面初期化
let _ = tui::init_tui();
// イベントハンドラ
let mut event_handler: EventHandler = EventHandler::new();
// イベント処理
event_handler.run();
// 画面復旧
let _ = tui::end_tui();
}
TOC
- 準備
- ターミナル入出力を試す
- ターミナル系crateを利用する
- 編集データと表示処理
- 画面制御
- その他
GitHubにコードをアップロードしています。
コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。
# Example
$ cargo run --examples first_step