confyとはどんなライブラリか
READMEの最初の文が一番分かりやすいかもしれない。
Zero-boilerplate configuration management.
面倒くさい処理を書かなくても簡単に設定ファイルを読み込んだり書き換えたりできるので、ちょっとしたツールを作るのに最適。設定ファイルはTOMLとYAMLに対応しており、どちらで記述するかはCargo.tomlに設定する。デフォルトはTOML。
実行環境
OS: Ubuntu 20.04.3 LTS
rustc: 1.56.1 (59eed8a2a 2021-11-01)
cargo: 1.56.0 (4ed5d137b 2021-10-04)
confy: 0.4.0
参考にしたページ
confyのリポジトリ
confyはごく小さなライブラリなので、何か分からないことがあればソースコードを読んだ方が早かった。
https://github.com/rust-cli/confy
docs.rsのページ
docs.rsはRustのdoc commentを乗せているページ。大抵の調べものはここを参照すれば解決するのだが、間違えてひとつ古いバージョンのドキュメントを参照してしまっていたのでハマってしまった・・・。Google検索が出すページがひとつ古かったのが原因だったのだが、ひと通り作業を追えるまで気づかなかった。
https://docs.rs/confy/0.4.0/confy/index.html
最小記述
最小の記述はたったこれだけ。
[package]
name = "your-app"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = "^1.0"
serde_derive = "^1.0"
confy = "^0.4"
use confy;
use confy::ConfyError;
use serde_derive::{Deserialize, Serialize};
# [derive(Default, Serialize, Deserialize, Debug)]
struct AppConfig { version: i32, }
fn main() -> Result<(), ConfyError> {
let mut cfg = confy::load::<AppConfig>("config-file-name")?; // 設定ファイルの読込み
cfg.version += 1;
confy::store("config-file-name", cfg)?; // 設定ファイルの書込み
Ok(())
}
初回生成されるファイルの値を変更したい場合
初回実行時は設定ファイルが作成されていないので、loadメソッドを実行した際に各設定項目にデフォルト値を適用した設定ファイルが作成される。(※ファイルを出力するディレクトリは後述する)設定のデフォルト値を定義したい場合は以下の通り、Default
トレイトの実装を変更すればよい。
- #[derive(Default, Serialize, Deserialize, Debug)]
+ #[derive( Serialize, Deserialize, Debug)]
struct AppConfig { version: i32, }
+
+ impl Default for AppConfig {
+ fn default() -> Self {
+ Self { version: 1 }
+ }
+ }
設定ファイルが生成される場所
上記のload()
およびstore()
の関数にはapp_name
しか渡していない。この時設定ファイルが生成されるディレクトリはdirectories::ProjectDirs::from("rs", "", app_name)
で決定される。この実行結果はOSによって異なり、以下の通りとなる。
- Linux: ~/.config/{app_name}
- Windows: {FOLDERID_RoamingAppData}\{app_name}
- Mac OS: ~/Library/Preferences/rs.{app_name}
出力されるファイルの名前はデフォルトではapp_name
と同じ。これを変更したい場合は第二引数に指定すればよい。
上記に関するドキュメントが読みたい方はこちらを参照してください。
TOML形式の代わりにYAML形式を使いたい場合
Cargo.tomlに以下の記述を以下の通り変更する。
- confy = "^0.4"
+ confy = { version = "^0.4", features = ["yaml_conf"], default-features = false }