LoginSignup
12
2

More than 1 year has passed since last update.

Rust製の設定管理ライブラリconfyを試す

Last updated at Posted at 2022-01-11

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

最小記述

最小の記述はたったこれだけ。

Cargo.toml
[package]
name = "your-app"
version = "0.1.0"
edition = "2021"

[dependencies]
serde = "^1.0"
serde_derive = "^1.0"
confy = "^0.4"
main.rs
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トレイトの実装を変更すればよい。

main.rs
- #[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に以下の記述を以下の通り変更する。

Cargo.toml
- confy = "^0.4"
+ confy = { version = "^0.4", features = ["yaml_conf"], default-features = false }
12
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
2