blog.euxn.me

golangで設定記述にTOMLを使う

2016-07-28 Thu.

golang での設定記述言語は YAML の他に TOML も人気があるようです。

(2016/7/28 時点)

TOML はdein.vimのプラグイン記述でも使われていますし、 YAML に比べシンプルかつ、toml ライブラリの方が親切そうなので、TOML を使用しています。

使い方

TOML の仕様に沿って記述しますが、簡単な設定であればシンプルに記述できます。

1[API]
2port = 8000
3version = "v1"
4endpoint = "api.example.com"
5debug = true
6

golang のコード側では、コンフィグファイルに対応した struct を定義します。

1package main
2
3import (
4 "fmt"
5 "github.com/BurntSushi/toml"
6)
7
8type Config struct {
9 API APIConfig
10}
11
12type APIConfig struct {
13 Port uint
14 Version string
15 Endpoint string
16 Debug bool
17}
18
19var config Config
20_, err := toml.DecodeFile("config.toml", &config)
21if err != nil {
22 // Error Handling
23}
24
25fmt.Println("port:", config.API.port) //=> 8000
26

toml ファイルに[]で指定した名称と、代入する構造体のメンバの名称は揃えます。 golang が CamelCase なので toml も CamelCase になります。頭文字は問われないようです。

おおもと(ここでは Config)以下の構造体の名称は TOML 側では記述されません。

Array になるケース

テストケースのリクエストを TOML で書く場合等に Array を使いたくなると思います。 TOML は[[]]で Array 要素を記述できます。 例として検索を行う API のテストケースを記述すると以下のようになります。

1package test
2
3import (
4 "github.com/BurntSushi/toml"
5)
6
7type TestCases struct {
8 InvalidUserNameCases []RequestParameter
9 InvalidSearchWordCases []RequestParameter
10}
11
12type RequestParameter struct {
13 UserName string `url:"user_name"`
14 SearchWord string `url:"search_word"`
15}
16
17var testCases TestCases
18_, err := toml.DecodeFile("test_cases.toml", &testCases)
19if err != nil {
20 // Error Handling
21}
22
1[[InvalidUserNameCases]]
2userName = "$dollar"
3searchWord = "searchWord"
4
5[[InvalidUserNameCases]]
6userName = "%percent"
7searchWord = "searchWord"
8
9
10[[InvalidSearchWordCases]]
11userName = "user"
12searchWord = ""
13
14[[InvalidSearchWordCases]]
15userName = "user"
16searchWord = "forbiddenWord"
17

基本は上記と同様に、TOML に記載する Array になる要素の名称と、おおもとの構造体のメンバの名称を揃えます。 この際、該当のメンバの型を、各要素の値に対応した構造体の Array にします。

実態は普通の構造体なので、tag 等も普通に使えます。 構造体をクエリストリングに変換するgoogle/go-querystringurlタグも正常に動作します。

参考

toml については以下で詳しく説明されています。