Skip to content

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) ) によって決定されます。

開発目的で .envrcdirenv を使用する傾向があります。 .envrc に以下があります。

Terminal window
export RATATUI_COUNTER_CONFIG=`pwd`/.config
export RATATUI_COUNTER_DATA=`pwd`/.data
export RATATUI_COUNTER_LOG_LEVEL=debug

これにより、ログ ファイルが RATATUI_ASYNC_TEMPLATE_DATA フォルダー (つまり、現在のディレクトリの .data フォルダー) に配置され、cargo run を使用してプロトタイプ作成および開発しているときに、ログ レベルが RUST_LOG (つまり、debug) に設定されます。

上半分は、tui-logger ウィジェットで垂直分割された TUI が表示された iTerm2 ターミナルです。下半分は、ログ ファイルで tail -f を実行した出力が表示された ITerm2 ターミナルです。

RATATUI_ASYNC_TEMPLATE_CONFIG 環境変数を使用すると、同じプログラムのローカル ユーザー構成に影響を与えない、開発時のテストに使用できる構成データも取得できます。

パニックハンドラー

最後に、initialize_panic_handler() 関数について説明します。この関数も src/utils.rs で定義されており、アプリケーションがパニックになったときにコールバックを定義するために使用されます。アプリケーションがパニックになる理由はいくつかあります (たとえば、None.unwrap() を呼び出す場合など)。このような状況が発生した場合、次の点に注意する必要があります。

  1. ユーザーがエラーを報告できるように、役立つスタック トレースを提供する。
  2. ユーザーのターミナル状態を不完全な状態のままにせず、元の状態に戻す。

以下のスクリーンショットでは、キーが押されたときに呼び出される関数に None.unwrap() を追加して、より見栄えの良いバックトレースがどのようなものかを確認できるようにしています。

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