【おれの備忘録】はじめてのRust-コマンド引数・環境変数・設定ファイル

オウルです。

やろうやろうと思っていたRustの学習をはじめました。本記事は、どちらかというと自分用の備忘録です。なので、Rust初心者の方は、まず先にこんな記事より遥かに役立つThe Rust Programming Languageを是非ご覧ください。

The Rust Programming Languageを読んだものの、読んだだけではコードをかける気がしないので、実践あるのみ。簡単だけど、よく使うCSV読み込み、XMLパース、データベースにデータ登録あたりを実装してみます。

あわせて、見返したときに当時の実装の根拠となるThe Rust Programming LanguageThe Rust community’s crate registryやGitHubのリンクを貼るようにします。まずは、動くアプリを目指して、その後にRust Performance Pitfallsにあるようなことを意識してパフォーマンス改善につなげていきます。

ローカル環境
language Rust 1.51.0
os WSL Ubuntu 21.04
editor VSCode

コマンド引数と設定ファイル

コンソールアプリでは、コマンド引数、若しくは設定ファイルがつきものです。まずは、この2つから実装を進めていきます。Loggingはとても重要ですが、こちらは次回以降にします。

モジュールを複数のファイルに分割

コマンド引数、環境変数、設定ファイルをモジュール化して3ファイルに分割します。

ファイル構成

config
|- app_args.rs
|- app_env.rs
|- app_settings.rs
config.rs
lib.rs
main.rs

config.rs

3つのモジュールをスコープに持ち込み、かつ再公開しています。

もし、app_argsでapp_envを使用する場合は、次のようにsuperを指定してスコープに持ち込みます。

コマンド引数

コマンドライン引数を解析するclapというクールなCrateがあるので導入します。

因みにThe Rust Programming Languageでは、標準ライブラリを使用したコマンドラインプログラムを構築するがあります。

Cargo.toml

まずはAppArgs構造体を定義します。フィールドは、データベースのホスト、データベース名、ポートとします。データベース接続には、アカウントとパスワードが必要となりますが、この2つは学習を兼ねて環境変数から取得するようにします。

AppArgs構造体

コマンド引数の解析部分は、clapのQuick Exampleにある’builder pattern’で実装します。

エラーハンドリングにanyhowを導入していますが、次回以降にエラーハンドリングという題目で取り上げたいと思っています。

環境変数

AppEnv構造体

環境変数の取得には標準ライブラリを使用します。The Rust Programming Languageの環境変数を取り扱うにあるように、env::var関数は、 環境変数がセットされていたら、環境変数の値を含むOk列挙子の成功値になるResultを返します。 環境変数がセットされていなければ、Err列挙子を返します。

設定ファイル

設定ファイルはJSON形式とします。

AppSettings構造体

once_cellを使ってAppSettingsをグローバルデータとして初期化します。シリアライズ/デシリアライズには、serdeを使います。参照のみのためMutexはなしです。

おまけ

おまけで実装するにあたり、導入したライブラリの関数のシグニチャで初めてみたTrait、今後使いたいTraitなどを調べてみます。

std::convert::AsRef

Stringと&strの両方を引数として受け入れたい場合(&strに変換できるすべての参照を引数として受け入れたいこと)は、関数のシグニチャにAsRefを受け取るジェネリクスを配置します。次回以降で予定しているXMLパース、CSVの箇所(std::path::Path)で使います。

std::convert::AsRefにあるExamplesのコードです。

これが可能なのは、Stringと&strの両方がAsRefを実装しているためです。

他にも、AsRefとBorrowの特性の違い、注意事項として、コストのかかる変換を行う必要がある場合は、タイプ&Tを使用してFromを実装するか、カスタム関数を作成すること、変換が失敗する可能性がある場合は、Option またはResult を返す専用のメソッドを使用することなどがあります。

カテゴリーRust

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA