はじめに
type HogeType int
const (
HogeTypeA HogeType = 0 // A
HogeTypeB HogeType = 1 // B
HogeTypeC HogeType = 2 // C
)
みたいな列挙定数があったときに、各定数のコメントを元に
func (src HogeType) Name() string {
switch src {
case HogeTypeA:
return "A"
case HogeTypeB:
return "B"
case HogeTypeC:
return "C"
default:
return fmt.Sprintf("%v", src)
}
}
の様なメソッドを生成するツールを作りました。
(正確にいうとメインで書いたのは自分ではなく会社の別メンバーですが、許可を得て自分が記事にしますm(_ _)m)
定数追加時の修正漏れが防げます。
インストール
$ go get github.com/knightso/enameg/cmd/enameg
使い方
type定義の前に // +enameg
というコメントを書きます。
// +enameg
type HogeType int
そしてコマンド実行します。
$ enameg <ファイルまたはディレクトリ名>
<ファイル名>_ename.go というファイルにNameメソッドが出力されます。
go generate利用例↓
//go:generate enameg $GOFILE
// +enameg
type HogeType int
const (
HogeTypeA HogeType = 0 // A
HogeTypeB HogeType = 1 // B
HogeTypeC HogeType = 2 // C
)
その他
自動生成部分に gowrtr というライブラリを利用させてもらいましたm(_ _)m
https://github.com/moznion/gowrtr
https://moznion.hatenadiary.com/entry/2019/01/14/111719
import文の要不要を考えなくてよくなったり、生成部品の再利用がしやすかったりととても便利なツールでしたが、正直今回の様な小規模生成ツールだとtext/templateでもよかったかな、と思いました(^_^;
もっと大規模で複雑な生成だと威力を発揮しそう。