147 lines
3.1 KiB
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
|
|
}
|