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  }