Rustでyamlを読み込む

Rustでなにか書こうと思ったときに、.bashrc の内容の置き換えができそうならやってみるかということになった。コードの中に変数的な内容直書きは流石に憚られると思い、設定ファイルを書き出すことにした。
設定ファイルはRubyを書くときになんとなくyamlで書いてた癖で、yamlファイルをRustで取り扱ってみようかということになった。
まずyamlを扱うライブラリを探して、yaml_rust というものがあった。こちらを使って、写経などしてみた。
まずプロジェクトの作成

$ cargo init yaml_pj

次にcatgo.tomlに ↑ のライブラリを依存すると教えてあげる。

[dependencies]
yaml-rust = "0.4"

つづいて src/main.rs にyamlを読み込む処理を書いてみる(ここは完全に写経)

extern crate yaml_rust;
use yaml_rust::{YamlLoader};

// https://github.com/chyh1990/yaml-rust の写経
fn main() {
let s =
"
servers:
- a.example.com
- b.example.com
- c.example.com
- d.example.com
";
let docs = YamlLoader::load_from_str(s).unwrap();
let doc = &docs[0];

println!("{:?}", doc);
}

んー、mediumはシンタックスハイライトないから渋い。
まぁとりあえず書いたのでcargoでbuildしてみる。するとこんな感じでbuildが始まる。

$ cargo build
Updating registry `https://github.com/rust-lang/crates.io-index`
Fetch [============> ] 24.28%

このbuildってやつはコードに変更があったときに差分をbuildし直してくれるそう。最初の一回目こんな小規模なのにめちゃくちゃ時間かかってしんどって思ったけど、2回目以降はそんなことなかった。
ちなみにエラーのときはこんな感じの表示がでる

$ cargo build
Updating registry `https://github.com/rust-lang/crates.io-index`
Downloading yaml-rust v0.4.0
Downloading linked-hash-map v0.5.1
Compiling linked-hash-map v0.5.1
Compiling yaml-rust v0.4.0
Compiling set_ssh_alias v0.1.0 (file:///Users/ryo/work/ryo/study_rust/set_ssh_alias)
error[E0432]: unresolved import `yaml_rst`
--> src/main.rs:2:5
|
2 | use yaml_rst::{YamlLoader, YamlEmitter};
| ^^^^^^^^ Maybe a missing `extern crate yaml_rst;`?
warning: unused import: `YamlEmitter`
--> src/main.rs:2:28
|
2 | use yaml_rst::{YamlLoader, YamlEmitter};
| ^^^^^^^^^^^
|
= note: #[warn(unused_imports)] on by default
error: aborting due to previous error
For more information about this error, try `rustc --explain E0432`.
error: Could not compile `set_ssh_alias`.
To learn more, run the command again with --verbose.

タイポとYamlEmitterってつかってなくね?っていうメッセージ。無事にbuildが通った時は

$ cargo build
Compiling set_ssh_alias v0.1.0 (file:///Users/ryo/work/ryo/study_rust/set_ssh_alias)
Finished dev [unoptimized + debuginfo] target(s) in 0.55 secs

こんな感じですぐ終わる。
私最初の cargo init のときに --bin オプションをつけ忘れていたので、バイナリができず。なのでしかたなく cargo run のコマンドで実行してみた。プロジェクトの途中でバイナリを出すようにする方法が知りたい。

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/set_ssh_alias`
Hash({String("servers"): Array([String("a.example.com"), String("b.example.com"), String("c.example.com"), String("d.example.com")])})

yamlの s をそのまま出力してしまったので Hash => Array => String × 4 な感じの標準出力になっています。
課題だらけですが、とりあえず Yaml が扱えたっぽいので記録としてメモします。