github.com/johnnyeven/libtools@v0.0.0-20191126065708-61829c1adf46/courier/client/gen/enums/enums.go (about) 1 package enums 2 3 import ( 4 "bytes" 5 "fmt" 6 "sort" 7 "strings" 8 9 "github.com/johnnyeven/libtools/codegen" 10 "github.com/johnnyeven/libtools/courier/enumeration" 11 "github.com/johnnyeven/libtools/courier/enumeration/gen" 12 swagger_gen "github.com/johnnyeven/libtools/courier/swagger/gen" 13 ) 14 15 var serviceEnumMap = map[string]map[string]enumeration.Enum{} 16 17 func RegisterEnumFromExtensions(serviceName string, tpe string, vals interface{}, values interface{}, labels interface{}) { 18 if vals, ok := vals.([]interface{}); ok { 19 values := values.([]interface{}) 20 labels := labels.([]interface{}) 21 22 enum := enumeration.Enum{} 23 24 for i, v := range vals { 25 lable := labels[i].(string) 26 if lable == "" { 27 lable = values[i].(string) 28 } 29 o := enumeration.EnumOption{ 30 Val: v, 31 Value: values[i], 32 Label: lable, 33 } 34 enum = append(enum, o) 35 } 36 37 RegisterEnum(serviceName, tpe, enum...) 38 } 39 } 40 41 func RegisterEnum(serviceName string, tpe string, options ...enumeration.EnumOption) { 42 serviceName = strings.ToLower(codegen.ToUpperCamelCase(serviceName)) 43 if serviceEnumMap[serviceName] == nil { 44 serviceEnumMap[serviceName] = map[string]enumeration.Enum{} 45 } 46 serviceEnumMap[serviceName][tpe] = options 47 } 48 49 func ToEnums(serviceName string, pkgName string) string { 50 serviceName = strings.ToLower(codegen.ToUpperCamelCase(serviceName)) 51 buf := &bytes.Buffer{} 52 imports := &bytes.Buffer{} 53 54 names := make([]string, 0) 55 56 for name := range serviceEnumMap[serviceName] { 57 names = append(names, name) 58 } 59 60 sort.Strings(names) 61 62 for _, name := range names { 63 if name == "Bool" { 64 continue 65 } 66 enum := serviceEnumMap[serviceName][name] 67 buf.Write(ToEnumDefines(name, enum)) 68 } 69 70 for _, name := range names { 71 if name == "Bool" { 72 continue 73 } 74 75 enum := serviceEnumMap[serviceName][name] 76 e := gen.NewEnum("", pkgName, name, swagger_gen.Enum(enum), false) 77 e.WriteAll(buf) 78 e.Importer.WriteToImports(imports) 79 } 80 81 return ` 82 package ` + pkgName + ` 83 84 import ( 85 "errors" 86 "bytes" 87 "encoding" 88 ` + imports.String() + ` 89 ) 90 91 ` + buf.String() 92 } 93 94 func ToEnumDefines(name string, enum enumeration.Enum) []byte { 95 buf := &bytes.Buffer{} 96 97 buf.WriteString(` 98 // swagger:enum 99 type ` + name + ` uint 100 101 const ( 102 `) 103 104 buf.WriteString(codegen.ToUpperSnakeCase(name) + `_UNKNOWN ` + name + ` = iota 105 `) 106 107 sort.Slice(enum, func(i, j int) bool { 108 return enum[i].Val.(float64) < enum[j].Val.(float64) 109 }) 110 111 index := 1 112 for _, item := range enum { 113 v := int(item.Val.(float64)) 114 if v > index { 115 buf.WriteString(`) 116 117 const ( 118 `) 119 buf.WriteString(codegen.ToUpperSnakeCase(name) + `__` + item.Value.(string) + fmt.Sprintf(" %s = iota + %d", name, v) + `// ` + item.Label + ` 120 `) 121 index = v + 1 122 continue 123 } 124 index++ 125 buf.WriteString(codegen.ToUpperSnakeCase(name) + `__` + item.Value.(string) + `// ` + item.Label + ` 126 `) 127 } 128 129 buf.WriteString(`)`) 130 131 return buf.Bytes() 132 }