Skip to content
master
Switch branches/tags
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

gonum

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

Install

From a github release

curl https://raw.githubusercontent.com/steinfletcher/gonum/master/download.sh | sh
mv bin/gonum /usr/local/bin

OR

go get -u github.com/steinfletcher/gonum

Example

To 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"
  }
}

Consumer api

The generated code would yield the following consumer api

Create an enum value

a := Red // OR var a Color = Red

Create an enum from a factory method

var name Color = NewColor("RED")

Get the display value

var name string = a.Name() // "RED"

Get all display values

var names []string = ColorNames() // []string{"RED", "BLUE"}

Get all values

var values []Color = ColorValues() // []string{Red, Blue}

Pass as an error

Enums implement Error() string which means they can be passed as errors.

var a error = Red

Developing

go build gonum.go
go generate
go test .

OR

make test