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
の詳細について詳しく説明します。