I don't recommend using this in production, but rather as an example of how one could go about using AST to generate code. I am not planning to maintain this or add any new features.
gonum is an enum generator for Go. It is inspired by the powerful enum types found in Java. gonum has the following capabilities
- Reference and compare enums using values
- Provide a display value for the enumerated fields
- Generate an enum instance from a string factory method
- Generate a slice of display values
- JSON support
- Enum instances can be passed as errors since they implement
Error() string
From a github release
curl https://raw.githubusercontent.com/steinfletcher/gonum/master/download.sh | sh
mv bin/gonum /usr/local/binOR
go get -u github.com/steinfletcher/gonumTo define an enum, create a struct with the suffix Enum. You can define a display value in the struct tag. Adding a hyphen will assign the field name to the display value.
You can then generate the enum as follows.
//go:generate gonum -types=ColorEnum,StatusEnum,SushiEnum
// generate an enum with display values. The display values are used for JSON serialization/deserialization
type ColorEnum struct {
Red string `enum:"RED"`
LightBlue string `enum:"LIGHT_BLUE"`
}
// generate an enum with default display values. The display values are set to the field names, e.g. `On` and `Off`
type StatusEnum struct {
On string `enum:"-"`
Off string `enum:"-"`
}
// generate an enum with display values and descriptions.
type SushiEnum struct {
Maki string `enum:"MAKI,Rice and filling wrapped in seaweed"`
Temaki string `enum:"TEMAKI,Hand rolled into a cone shape"`
Sashimi string `enum:"SASHIMI,Fish or shellfish served alone without rice"`
}When a description is defined the json is serialized as follows (not yet implemented)
{
"sushi": {
"name": "SASHIMI",
"description": "Fish or shellfish served alone without rice"
}
}The generated code would yield the following consumer api
a := Red // OR var a Color = Redvar name Color = NewColor("RED")var name string = a.Name() // "RED"var names []string = ColorNames() // []string{"RED", "BLUE"}var values []Color = ColorValues() // []string{Red, Blue}Enums implement Error() string which means they can be passed as errors.
var a error = Redgo build gonum.go
go generate
go test .OR
make test