A Go code generator that creates helper functions for string enum types.
For each type T string with const values, enumgen generates:
AllT() []T- Returns a slice of all enum values(t T) IsValid() bool- Returns true if t is a valid enum value(t T) Order() int- Returns the display order (opt-in via directive)
go install github.com/5n7/enumgen@latestAdd a go:generate directive to your package:
//go:generate enumgenThen run:
go generate ./...enumgen ./path/to/packageimport "github.com/5n7/enumgen"
// Generate and write to enums.gen.go
err := enumgen.Run("./mypackage")
// Generate without writing (for custom processing)
code, err := enumgen.Generate("./mypackage")Input (constants.go):
package user
//go:generate enumgen
type Status string
const (
StatusActive Status = "active"
StatusInactive Status = "inactive"
StatusPending Status = "pending"
)Output (enums.gen.go):
// Code generated by enumgen; DO NOT EDIT.
package user
// AllStatus returns a slice containing all valid Status values.
func AllStatus() []Status {
return []Status{
StatusActive,
StatusInactive,
StatusPending,
}
}
// IsValid returns true if s is a valid Status value.
func (s Status) IsValid() bool {
switch s {
case StatusActive,
StatusInactive,
StatusPending:
return true
default:
return false
}
}To generate an Order() method for sorting or display purposes, add the @enumgen:order directive to the type:
// @enumgen:order
type Priority string
const (
PriorityUnknown Priority = "unknown" // @order:99
PriorityLow Priority = "low"
PriorityMedium Priority = "medium"
PriorityHigh Priority = "high"
)This generates:
// Order returns the display order of p.
func (p Priority) Order() int {
switch p {
case PriorityUnknown:
return 99
case PriorityLow:
return 1
case PriorityMedium:
return 2
case PriorityHigh:
return 3
default:
return 999
}
}Order rules:
- Constants without
@order:Nare assigned sequential orders starting from 1 - Use
@order:Nto override the default order for specific values - Invalid values return 999
- Scans all
.gofiles in the current directory - Excludes
*_test.go,*.gen.go, and*_gen.gofiles - Writes output to
enums.gen.go
MIT