Rustでyamlを読み込む
Categories: TECHNOLOGY
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`](https://github.com/rust-lang/crates.io-index%60) Fetch [============>] 24.28%
このbuildってやつはコードに変更があったときに差分をbuildし直してくれるそう。最初の一回目こんな小規模なのにめちゃくちゃ時間かかってしんどって思ったけど、2回目以降はそんなことなかった。
ちなみにエラーのときはこんな感じの表示がでる
$ cargo build Updating registry `[https://github.com/rust-lang/crates.io-index`](https://github.com/rust-lang/crates.io-index%60) 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 が扱えたっぽいので記録としてメモします。
Tweet