vRp.CD2g_test/planner/configexport/internal/field.go

147 lines
3.1 KiB
Go

package internal
import (
"bytes"
"fmt"
"github.com/kercylan98/minotaur/utils/str"
"html/template"
"strings"
)
func NewField(configName, fieldName, fieldType string) *Field {
sourceType := fieldType
var handleStruct = func(configName, fieldType string) []*Field {
var fs []*Field
var s = strings.TrimSuffix(strings.TrimPrefix(fieldType, "{"), "}")
var fields []string
var field string
var leftBrackets []int
for i, c := range s {
switch c {
case ',':
if len(leftBrackets) == 0 {
fields = append(fields, field)
field = ""
} else {
field += string(c)
}
case '{':
leftBrackets = append(leftBrackets, i)
field += string(c)
case '}':
leftBrackets = leftBrackets[:len(leftBrackets)-1]
field += string(c)
if len(leftBrackets) == 0 {
fields = append(fields, field)
field = ""
}
default:
field += string(c)
}
}
if len(field) > 0 {
fields = append(fields, field)
}
for _, fieldInfo := range fields {
fieldName, fieldType := str.KV(strings.TrimSpace(fieldInfo), ":")
fs = append(fs, NewField(configName, str.FirstUpper(fieldName), fieldType))
}
return fs
}
var fs []*Field
var sliceField *Field
if t, exist := basicTypeName[fieldType]; exist {
fieldType = t
goto end
}
if strings.HasPrefix(fieldType, "[]") {
fieldType = strings.TrimPrefix(fieldType, "[]")
if t, exist := basicTypeName[fieldType]; exist {
fieldType = fmt.Sprintf("map[int]%s", t)
} else {
sliceField = NewField(configName, fieldName, fieldType)
fieldType = fmt.Sprintf("map[int]*%s", configName+fieldName)
}
goto end
}
fs = handleStruct(configName+fieldName, fieldType)
fieldType = fmt.Sprintf("*%s", configName+fieldName)
end:
{
return &Field{
Name: fieldName,
Type: fieldType,
SourceType: sourceType,
TypeNotStar: strings.TrimPrefix(fieldType, "*"),
Fields: fs,
SliceField: sliceField,
}
}
}
type Field struct {
Name string
Type string
SourceType string
TypeNotStar string
Fields []*Field
SliceField *Field
ExportParam string
Server bool
Describe string
Ignore bool
}
func (slf *Field) Struct() string {
if len(slf.Fields) == 0 && slf.SliceField == nil {
return ""
}
tmpl, err := template.New("struct").Parse(generateGoStructTemplate)
if err != nil {
return ""
}
var buf bytes.Buffer
if len(slf.Fields) > 0 {
if err = tmpl.Execute(&buf, slf); err != nil {
return ""
}
} else if slf.SliceField != nil {
if err = tmpl.Execute(&buf, slf.SliceField); err != nil {
return ""
}
}
s := buf.String()
return s
}
func (slf *Field) String() string {
if len(slf.Fields) == 0 && slf.SliceField == nil {
return ""
}
tmpl, err := template.New("struct").Parse(generateGoStructTemplate)
if err != nil {
return ""
}
var buf bytes.Buffer
if len(slf.Fields) > 0 {
if err = tmpl.Execute(&buf, slf); err != nil {
return ""
}
} else if slf.SliceField != nil {
if err = tmpl.Execute(&buf, slf.SliceField); err != nil {
return ""
}
}
s := buf.String()
for _, field := range slf.Fields {
s += fmt.Sprintf("%s", field.String())
}
return s
}