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.
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.
@ -50,4 +50,7 @@ The generated code is exactly the same as the Stringer tool plus the `<Type>Stri
## How to use
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.
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("package %s", g.pkg.name)
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.
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
g.buildValueToNameMap(runs, typeName, 10)
// SQL
g.addValuerAndScanner(runs, typeName, 0)
}
// splitIntoRuns breaks the values into runs of contiguous sequences.