FsYaml1.0 リリース

型を使ってカスタマイズする F# 用の YAML ライブラリを作りました。

別プロジェクトの設定ファイル読み込み用として作っていたんですが、ライブラリとして独立させた方が便利だと思ったので分離しました。
そういう背景があるので、このライブラリはパフォーマンスとかは全然考慮していませんし、YAML の全機能が使えるというわけでもありません。
あくまで、使いやすさを最重要視しています。


例えば、

Project: hoge
Budget: 30000000
Member: - { Name: aaa, Role: PM }
        - { Name: bbb, Role: SE }
        - { Name: ccc, Role: PG }
        - { Name: ddd, Role: PG }

という YAML を読み込む場合を考えます。
まずはこれをどういう型に落とし込むか考えます。

type Member = {
  Name: string
  Role: string
}
type t = {
  Project: string
  Budget: int
  Member: Member list
}

こんな感じでしょうか?
あとは、読み込むだけです。

let str = (* YAMLを読み込んで文字列化 *)
let p = Yaml.load<t> str

たったこれだけです!
この型を指定する部分は、ある程度自由に決めることができます。
例えば、Budget の部分を今は int で読み込んでいますが、

type t = {
  Project: string
  Budget: decimal
  Member: Member list
}

とすれば decimal 型で読み込めますし、Member 型を用意せずに、

type t = {
  Project: string
  Budget: decimal
  Member: Map<string, string> list
}

のように Map の list として読み込むこともできます。
なんなら、

type t = {
  Project: string
  Budget: decimal
  Member: string list
}

と、文字列として読み込んでしまうこともできます。
この辺の動作を、型を定義するだけでカスタマイズ可能になっているのが FsYaml の特徴です。


読み込むだけではなく、当然文字列へ変換することもできます。
これには、Yaml.dump にデータを渡すだけです。


これがあれば設定ファイルとしての XML の出番はほぼないんじゃないでしょうか。