🔐

gophenums: type-safe enumライブラリについて

2024/01/10に公開

お久しぶりです、エンジニアのビクトルです。
冬休みの前に、自動でenumを発生のライブラリーを実装したかったです。そしてGoでまだ触ったことがないbuilt-inパッケージで作成したくて、記事も書きたいと思ってきました。

はじめに

実装したいライブラリーはgoファイルの内容からコメントアウトを取ってGolangtemplateenumを作成というアイデアです。

こんな理想を考えました。

// このタイプから作成したいで、コメントアウトで `go generate`を実行して自動で作成したい
type animal string

したい発生コードは:

type Animal interface {
	__private()
}
func (v animal) __private(){}

詳しくはこの記事を読んでください

https://zenn.dev/vitis/articles/28890aec0494e0

Goコードファイルを解釈

Goは、その文書Goプログラミング言語仕様で構文とセマンティクスを定義しています。構文コード、型、宣言、および文がどのように解釈されるべきかを説明しています。

astparsertokenというbuilt-inライブラリーを使用することで、Goのソースコードを読み取り、解釈し、トークンに解析することができます。

コードはこんな感じです

package main

import (
	"go/ast"
	"go/token"
	"go/parser"
)

...
token := token.NewFileSet()

f, err := parser.ParseFile(token, filePointer, nil, parser.ParseComments)
...

ast.Inspect(f, func(node ast.Node) bool {
	switch expression := node.(type)
	case *ast.GenDecl:
		...
	case N:
		...
}

型をキャストしてコメントと検索している型を取得する方法です。

コメントと型を取得するために、ast.GenDeclast.TypeSpecの型に対してswitch内で確認できます。そこで、コメントがtemplateパッケージで生成したい型に関連しているかどうかを確認できます。

Show me the code!

ここです!

https://github.com/ervitis/gophenums

コントリビューションやフォークなどして学んで遊んでください!

終わり

この記事では、astパッケージについて少し詳しく説明し、ワイワイで実装をしました。これが他の人に役立ち、面白いものを構築できることを嬉しいです。☺️

Discussion