go-errgen書いた
goのstructにエラー定義を書いておけば良い感じで「エラーを返却する関数」をコード生成するツールであるgo-errgenを書きました.
Synopsisに書いてあるとおり,
package mypkg //go:generate errgen -type=myErrors type myErrors struct { FooErr error `errmsg:"this is FOO error"` BarErr error `errmsg:"this is BAR error [%d, %s]" vars:"hoge int, fuga string"` }
みたいな感じでstructにエラー定義を書いて,go:generate
を設定してから go generate
を実行すると
package mypkg import "errors" import "fmt" func FooErr() error { return errors.New("[ERR-1] this is FOO error") } func BarErr(hoge int, fuga string) error { return fmt.Errorf("[ERR-2] this is BAR error [%d, %s]", hoge, fuga) } func MyErrorsList() []string { return []string{ `[ERR-1] this is FOO error`, `[ERR-2] this is BAR error [%d, %s]`, } }
という感じのコードが my_errors_errmsg_gen.go
として生成されるというツールです.
これはエラーメッセージに「通し番号が付いたprefix」を付与したerrorを返却する関数をコード生成します.もし errmsg
に加えて vars
パラメータが定義されている場合はその値が関数の引数パラメータとして利用され,かつ fmt.Errorf()
によってsprintf互換のプレースホルダにbindされます.
主なモチベーションとしては,
- 集権的にエラーを定義して管理したい (エラー定義が散在するとつらい)
- エラーの特定を行う際にエラーコードを利用したい
というのがあり,特に後者はいろいろなチームから多く利用されるコンポーネントであれば必須に近い機能でしょう.で,集権的にエラーを管理するにしても,手でエラーコードを記述するようにしたところでうっかりミスってしまう可能性もありますし (例えばエラーコードを重複させてしまうとか),そこんところは機械的にやりたいな〜という気持ちからerrgenを作ったという感じです.
errgen -type=myErrors -prefix=My-Prefix
のように -prefix
を付与すると [My-Prefix-1]
のようにprefixを自由に設定することもできます.
この手の仕組みはプロジェクトごとに自作しがちだったんですが,毎度毎度書くというのも面倒だったのでこの度汎用的に使えるようツール化したという次第です.
ご利用くださいませ.