I just made a few mods to the stringer tool to generate a function that 
converts a string back to the const int type, e.g., for this const int type:

// SignalType provides standard signals -- can extend by starting at iota + 
last signal here
type SignalType int64

const (
        NilSignal             SignalType = iota
        SignalChildAdded                 // data is the added child
        SignalChildDeleted               // data is deleted child
        SignalChildrenDeleted            // no data
        SignalNodeUpdated                // entire node updated
        SignalFieldUpdated               // a field was updated -- data is name 
of field
        SignalTypeBaseN                  // number of base-level signal type 
consts -- this is start for any derived ones
)

it generates this function in the stringer output:

func StringToSignalType(s string) (SignalType, error) {
        for i := 0; i < len(_SignalType_index)-1; i++ {
                if s == 
_SignalType_name[_SignalType_index[i]:_SignalType_index[i+1]] {
                        return SignalType(i), nil
                }
        }
        return 0, fmt.Errorf("String %v is not a valid option for type 
SignalType", s)
}

Seems like this might be of general utility?  Is there some other simpler way 
of doing this that I’m overlooking?  Patch below.  Didn’t handle the 
multiple-runs and map cases yet..

- Randy

diff --git a/cmd/stringer/stringer.go b/cmd/stringer/stringer.go
index 4b8d1ba4..291051f8 100644
--- a/cmd/stringer/stringer.go
+++ b/cmd/stringer/stringer.go
@@ -132,7 +132,7 @@ func main() {
        g.Printf("\n")
        g.Printf("package %s", g.pkg.name)
        g.Printf("\n")
-       g.Printf("import \"strconv\"\n") // Used by all methods.
+       g.Printf("import (\"strconv\"; \"fmt\")\n") // Used by all methods.
 
        // Run generate for each type.
        for _, typeName := range types {
@@ -584,6 +584,15 @@ const stringOneRun = `func (i %[1]s) String() string {
        }
        return _%[1]s_name[_%[1]s_index[i]:_%[1]s_index[i+1]]
 }
+
+func StringTo%[1]s(s string) (%[1]s, error) {
+       for i := 0; i < len(_%[1]s_index)-1; i++ {
+               if s == _%[1]s_name[_%[1]s_index[i]:_%[1]s_index[i+1]] {
+                       return %[1]s(i), nil
+               }
+       }
+       return 0, fmt.Errorf("String %%v is not a valid option for type %[1]s", 
s)
+}
 `
 
 // Arguments to format are:
@@ -600,6 +609,15 @@ const stringOneRunWithOffset = `func (i %[1]s) String() 
string {
        }
        return _%[1]s_name[_%[1]s_index[i] : _%[1]s_index[i+1]]
 }
+
+func StringTo%[1]s(s string) (%[1]s, error) {
+       for i := 0; i < len(_%[1]s_index)-1; i++ {
+               if s == _%[1]s_name[_%[1]s_index[i]:_%[1]s_index[i+1]] {
+                       return %[1]s(i + %[2]s), nil
+               }
+       }
+       return 0, fmt.Errorf("String %%v is not a valid option for type %[1]s", 
s)
+}
 `
 
 // buildMultipleRuns generates the variables and String method for multiple 
runs of contiguous values.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to