sumgen generates interface method implementations from sum-type declarations.
go get -u github.com/smasher164/sumgen
Usage: sumgen is a tool intended for go generate, but can also be run standalone. An example declaration of a sum-type would be
package main
//go:generate sumgen "Expr = KeyValueExpr | *CallExpr"
type Expr interface {
expr()
}
type KeyValueExpr struct {
Key Expr
Colon int
Value Expr
}
type CallExpr struct {
Fun Expr
Lparen int
Args []Expr
Ellipsis bool
Rparen int
}
func main() {}
Running go generate in the package directory will output the following to a file named DIRECTORY_NAME_sumgen.go.
// Code generated by "sumgen"; DO NOT EDIT.
package main
func (_ KeyValueExpr) expr() { panic("default implementation") }
func (_ *CallExpr) expr() { panic("default implementation") }
Each declaration follows the following structure:
Def = LhsType "=" RhsType { "|" RhsType } .
LhsType = identifier .
RhsType = [ * ] identifier .
More than one declaration can be be made per interface_name.
To make the concrete_typename a pointer receiver, simply add a '*' in front of it.