A Go tool to auto generate methods for your enums
Go to file
marco 3d7dacca3a fixed imports 2016-04-09 01:20:52 +02:00
testdata Added a method to the generated code to get the enum value from the string name. Fixed all tests. 2015-12-29 13:14:54 +00:00
README.md implemented sql flag 2016-02-06 22:46:59 +01:00
endtoend_test.go Uncommented commented code by error 2015-12-29 13:48:01 +00:00
enumer fixed imports 2016-04-09 01:20:52 +02:00
enumer.go Added a new flag/feature to generate json marshaling methods 2016-01-19 19:39:33 +00:00
golden_test.go Updated tests 2016-01-19 19:54:00 +00:00
sql.go handle database NULL values 2016-02-11 19:27:29 +01:00
stringer.go fixed imports 2016-04-09 01:20:52 +02:00
util_test.go Added a method to the generated code to get the enum value from the string name. Fixed all tests. 2015-12-29 13:14:54 +00:00

README.md

#Enumer Enumer is a tool to generate Go code that adds useful methods to Go enums (constants with a specific type). It started as a fork of Rob Pikes Stringer tool.

##Generated functions and methods When Enumer is applied to a type, it will generate three methods and one function:

  • A method String() that returns the string representation of the enum value. This makes the enum conform the Stringer interface, so whenever you print an enum value, you'll get the string name instead of a number.
  • A function <Type>String(s string) to get the enum value from its string representation. This is useful when you need to read enum values from the command line arguments, from a configuration file, from a REST API request... In short, from those places where using the real enum value (an integer) would be almost meaningless or hard to trace or use by a human.
  • And two more methods, MarshalJSON() and UnmarshalJSON(), that makes the enum conform the json.Marshaler and json.Unmarshaler interfaces. Very useful to use it in JSON APIs.

For example, if we have an enum type called Pill,

type Pill int

const (
	Placebo Pill = iota
	Aspirin
	Ibuprofen
	Paracetamol
	Acetaminophen = Paracetamol
)

executing enumer -type=Pill will generate a new file with four methods:

func (i Pill) String() string {
    //...
}

func PillString(s string) (Pill, error) {
    //...
}

func (i Pill) MarshalJSON() ([]byte, error) {
	//...
}

func (i *Pill) UnmarshalJSON(data []byte) error {
	//...
}

From now on, we can:

// Convert any Pill value to string
var aspirinString string = Aspirin.String()
// (or use it in any place where a Stringer is accepted)
fmt.Println("I need ", Paracetamol) // Will print "I need Paracetamol"

// Convert a string with the enum name to the corresponding enum value
pill, err := PillString("Ibuprofen")
if err != nil {
    fmt.Println("Unrecognized pill: ", err)
    return
}
// Now pill == Ibuprofen

// Marshal/unmarshal to/from json strings, either directly or automatically when
// the enum is a field of a struct
pillJSON := Aspirin.MarshalJSON()
// Now pillJSON == `"Aspirin"`

The generated code is exactly the same as the Stringer tool plus the mentioned additions, so you can use Enumer where you are already using Stringer without any code change.

How to use

The usage of Enumer is the same as Stringer, so you can refer to the Stringer docs for more information.

There are two flags added: noJSON and sql. If the noJSON flag is set to true (i.e. enumer -type=Pill -noJSON), the JSON related methods won't be generated. And if the sql flag is set to true, the Scanner and Valuer interface will be implemented to seamlessly use the enum in a database model.

Inspiring projects