2014年12月23日火曜日

C++からyamlで設定を書くためのライブラリを作りました

未だに、わりとC++で書いてます。 以前から設定ファイル周りのライブラリをちゃんと作りたいと思っていました。 Jubatus含めて今までJSONベースでやっていましたが、コメントが書けなかったり、キーが文字列だったりというのがあって、YAMLにしたいなぁと。 いい加減どうにかしようと思って、エイヤでlibyamlのthin wrapperと、pficommonスタイルのcastを実装した、yamlcastというライブラリを作りました。 pficommonのjsoncastの代用です。 MITライセンスです。

yamlcast

read-the-docsを知ったり、SphinxのC++ドメインを使ってみたかったりで、ひと通りread-the-docsにドキュメントも書いてみました。 世の中便利ですね。

使い方ですが、ドキュメントにある通り、まずYAMLドキュメントを読み込みます。 読み込んだら、yamlcastで任意の型にキャストします。 想定した型でなかった場合(たとえば、std::vectorに変換したかったのに、対象のYAMLがシーケンスではなかったとか、intに変換したかったのに変換できない文字列だったとか)、例外が発生します。 ユーザー定義の型の場合は、pficommonスタイルのシリアライザが使えます。 serializeという名前のテンプレートメンバ関数を作って、シリアライズ対象の変数を指定すると、YAML文書のマッピングをその型に変換します。

struct User {
  int age;
  std::string name;

  template 
  void serialize(Ar& ar) {
    ar & MEMBER(age) & MEMBER(name);
  }
};

User user = yamlcast::yaml_cast(*doc);

こんな感じです。

もともとpficommonのJSONにも同様なcastがあったのですが、エラーがわかりにくいという問題がありました。 libyamlは、各ノードが何行目何カラム目に対応しているかの情報があるので、それと合わせればだいたいどこに問題があるかわかるとおもいます。 まだ自分でもほとんど使ってませんが、使ってみたい方いたら感想など教えていただけると。

0 件のコメント:

コメントを投稿