Utils.rs
コマンドラインの引数解析 ( clap )
このファイルでは、clap Args structを定義します。
use std::path::PathBuf;
use clap::Parser;
use crate::utils::version;
#[derive(Parser, Debug)]#[command(author, version = version(), about)]pub struct Cli { #[arg(short, long, value_name = "FLOAT", help = "Tick rate, i.e. number of ticks per second", default_value_t = 1.0)] pub tick_rate: f64,
#[arg( short, long, value_name = "FLOAT", help = "Frame rate, i.e. number of frames per second", default_value_t = 60.0 )] pub frame_rate: f64,}これにより、必要に応じてコマンドライン引数をターミナルユーザーインターフェイスに渡すことができます。

コマンドライン引数に加えて、通常は、コマンドライン プログラムのバージョンを要求時に表示する必要があります。clap コマンドでは、version() という引数を渡します。この
version() 関数 (src/utils.rs で定義) は、RATATUI_ASYNC_TEMPLATE_GIT_INFO という環境変数を使用して、git コミット ハッシュでバージョン番号を取得します。
RATATUI_ASYNC_TEMPLATE_GIT_INFO は、cargo でビルドするときに、次の行により ./build.rs に設定されます。
println!("cargo:rustc-env=RATATUI_ASYNC_TEMPLATE_GIT_INFO={}", git_describe);
utils::version() で文字列テンプレートコードを変更することにより、バージョン文字列がどのように見えるかを構成できます。
XDGベースディレクトリ仕様
ほとんどのコマンドラインツールには、どこかに保存する必要がある構成ファイルまたはデータファイルがあります。良い市民になるには、XDG Base Directoryの仕様に従うことを検討することをお勧めします。
このテンプレートは、 directories-rs および ProjectDirs ‘の構成およびデータローカルディレクトリを使用します。オペレーティングシステムの正確な場所の詳細については、こちらをご覧ください: https://github.com/dirs-dev/directories-rs#projectdirs。
このテンプレートは、 --version コマンドライン引数を渡すときに場所を表示します。

あなたまたはあなたのユーザーが構成とデータファイルを配置する場所をオーバーライドしたい状況があります。これは、環境変数 RATATUI_ASYNC_TEMPLATE_CONFIG および RATATUI_ASYNC_TEMPLATE_DATA を使用することで実現できます。
構成ディレクトリとデータディレクトリを計算する関数は src/utils.rs にあります。 utils::get_config_dir() および utils::get_data_dir() を自由に変更してください。
ロギング
utils::initialize_logging() 関数は src/utils.rs で定義されています。ログレベルは、 RUST_LOG 環境変数 (default = log::LevelFilter::Info ) によって決定されます。さらに、ログファイルの場所は、 RATATUI_ASYNC_TEMPLATE_DATA 環境変数 (デフォルト= XDG_DATA_HOME (local) ) によって決定されます。
開発目的で .envrc と direnv を使用する傾向があります。 .envrc に以下があります。
export RATATUI_COUNTER_CONFIG=`pwd`/.configexport RATATUI_COUNTER_DATA=`pwd`/.dataexport RATATUI_COUNTER_LOG_LEVEL=debugこれにより、ログ ファイルが RATATUI_ASYNC_TEMPLATE_DATA フォルダー (つまり、現在のディレクトリの .data フォルダー) に配置され、cargo run を使用してプロトタイプ作成および開発しているときに、ログ レベルが RUST_LOG (つまり、debug) に設定されます。

RATATUI_ASYNC_TEMPLATE_CONFIG 環境変数を使用すると、同じプログラムのローカル ユーザー構成に影響を与えない、開発時のテストに使用できる構成データも取得できます。
パニックハンドラー
最後に、initialize_panic_handler() 関数について説明します。この関数も src/utils.rs で定義されており、アプリケーションがパニックになったときにコールバックを定義するために使用されます。アプリケーションがパニックになる理由はいくつかあります (たとえば、None で .unwrap() を呼び出す場合など)。このような状況が発生した場合、次の点に注意する必要があります。
- ユーザーがエラーを報告できるように、役立つスタック トレースを提供する。
- ユーザーのターミナル状態を不完全な状態のままにせず、元の状態に戻す。
以下のスクリーンショットでは、キーが押されたときに呼び出される関数に None.unwrap() を追加して、より見栄えの良いバックトレースがどのようなものかを確認できるようにしています。

utils::initialize_panic_handler() は、 Tui::new().exit() を呼び出して、ユーザーがTUIプログラムを開始する前にターミナル状態をリセットします。次のセクションでは、 Tui の詳細について詳しく説明します。