編集用バッファとしてBinDataを作りましたが、アプリ全体として参照されたり、変更されたりしそうなのでコンテキストオブジェクトあるいはシングルトンパターンぽい状態管理用の構造体を作り、その中にBinDataを入れて、各処理に受け渡そうと思います。
ということで、Messageという管理用の構造体を作りました。
pub(crate) struct Message {
bin_data: BinData,
}
impl Message {
pub(crate) fn new() -> Self {
Self { bin_data: BinData::new() }
}
pub(crate) fn bin_data(&self) -> &BinData{
&self.bin_data
}
pub(crate) fn bin_data_mut(&mut self) -> &mut BinData{
&mut self.bin_data
}
}
メインの中でこの構造体を各処理の引数として渡すように変更しました。
可変参照と不変参照を使い分けて変更が必要な箇所だけミュータブルに引き渡すようにしています。
mod message;
use crate::message::Message ;
fn main() {
// 状態管理
let mut message = Message::new();
// 仮データ
let bin_data = message.bin_data_mut();
bin_data.push_back(vec![
0x01, 0x02, 0x03, 0x00, 0x63, 0x71, 0x00, 0x61, 0x62, 0x0f, 0x01, 0x02, 0x03, 0x00, 0x63,
0x71, 0x0f, 0x61, 0x62, 0x63, 0x01, 0xff, 0x03, 0x00, 0x63, 0x71, 0x0f, 0x61, 0x62, 0x63,
]);
// 省略
// イベントループ
while event_handler.is_looping() {
// 描画処理
let _ = render_main(& message);
// イベント処理
event_handler.run(&mut message);
}
// 省略
テスト用に仮データをセットしています。後ほど削除予定です。
もっとスマートな方法がありそうです。1
テスト方法も検討していきたいと思います。
- Arc+Mutexなど ↩︎
TOC
- 準備
- ターミナル入出力を試す
- ターミナル系crateを利用する
- 編集データと表示処理
- 画面制御
- その他
GitHubにコードをアップロードしています。
コードのコメントに書かれているfirst_stepなどをcargoコマンドに渡すと実行できます。
# Example
$ cargo run --examples first_step