implemented Scanner and Valuer interface

This commit is contained in:
marco 2016-01-12 12:37:51 +01:00
parent a8751cee5a
commit af7ef17caa
3 changed files with 44 additions and 4 deletions

View File

@ -1,4 +1,4 @@
#Enumer # Enumer
Enumer generates Go code to get string names from enum values and viceversa. Enumer generates Go code to get string names from enum values and viceversa.
It is a fork of [Rob Pikes Stringer tool](https://godoc.org/golang.org/x/tools/cmd/stringer) It is a fork of [Rob Pikes Stringer tool](https://godoc.org/golang.org/x/tools/cmd/stringer)
but adding a *"string to enum value"* method to the generated code. but adding a *"string to enum value"* method to the generated code.
@ -50,4 +50,7 @@ The generated code is exactly the same as the Stringer tool plus the `<Type>Stri
## How to use ## How to use
The usage of Enumer is the same as Stringer, no changes were introduced. The usage of Enumer is the same as Stringer, no changes were introduced.
For more information please refer to the [Stringer docs](https://godoc.org/golang.org/x/tools/cmd/stringer) For more information please refer to the [Stringer docs](https://godoc.org/golang.org/x/tools/cmd/stringer)
## Additional functions of this fork
This fork additionally implements the Scanner and Valuer interface to use a enum seamlessly in a database model.

31
sql.go Normal file
View File

@ -0,0 +1,31 @@
package main
// Arguments to format are:
// [1]: type name
const valuer = `func (i %[1]s) Value() (driver.Value, error) {
return i.String(), nil
}
`
const scanner = `func (i %[1]s) Scan(value interface{}) error {
str, ok := value.(string)
if !ok {
fmt.Errorf("value is not a string")
}
val, err := %[1]sString(str)
if err != nil {
return err
}
i = val
return nil
}
`
func (g *Generator) addValuerAndScanner(runs [][]Value, typeName string, runsThreshold int) {
g.Printf("\n")
g.Printf(valuer, typeName)
g.Printf("\n\n")
g.Printf(scanner, typeName)
}

View File

@ -128,11 +128,14 @@ func main() {
} }
// Print the header and package clause. // Print the header and package clause.
g.Printf("// Code generated by \"stringer %s\"; DO NOT EDIT\n", strings.Join(os.Args[1:], " ")) g.Printf("// Code generated by \"enumer %s\"; DO NOT EDIT\n", strings.Join(os.Args[1:], " "))
g.Printf("\n") g.Printf("\n")
g.Printf("package %s", g.pkg.name) g.Printf("package %s", g.pkg.name)
g.Printf("\n") g.Printf("\n")
g.Printf("import \"fmt\"\n") // Used by all methods. g.Printf("import (\n")
g.Printf("\t\"fmt\"\n")
g.Printf("\t\"database/sql/driver\"\n")
g.Printf(")\n")
// Run generate for each type. // Run generate for each type.
for _, typeName := range types { for _, typeName := range types {
@ -310,6 +313,9 @@ func (g *Generator) generate(typeName string) {
} }
// ENUMER: This is the only addition over the original stringer code. Everything else is in enumer.go // ENUMER: This is the only addition over the original stringer code. Everything else is in enumer.go
g.buildValueToNameMap(runs, typeName, 10) g.buildValueToNameMap(runs, typeName, 10)
// SQL
g.addValuerAndScanner(runs, typeName, 0)
} }
// splitIntoRuns breaks the values into runs of contiguous sequences. // splitIntoRuns breaks the values into runs of contiguous sequences.