mirror of
https://github.com/opbnq-q/nto-cli.git
synced 2025-12-06 21:40:35 +07:00
61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"errors"
|
|
"log"
|
|
"nto_cli/entities"
|
|
"strings"
|
|
|
|
"github.com/fatih/structtag"
|
|
)
|
|
|
|
func SplitStructField(field string) (*entities.Field, error) {
|
|
if strings.Contains(field, "type") {
|
|
return nil, nil
|
|
}
|
|
if len(strings.TrimSpace(field)) < 2 {
|
|
return nil, errors.New("unexpected end of struct field")
|
|
}
|
|
startBacktick := strings.Index(field, "`")
|
|
endBacktick := -1
|
|
|
|
var metadata []entities.Metadata
|
|
|
|
if startBacktick > -1 {
|
|
endBacktick = strings.Index(field[startBacktick+1:], "`")
|
|
if endBacktick > -1 {
|
|
endBacktick += startBacktick + 1
|
|
meta := field[startBacktick+1 : endBacktick]
|
|
tags, err := structtag.Parse(meta)
|
|
if err != nil {
|
|
log.Fatalf("failed to parse struct tag: %s", err)
|
|
}
|
|
uiTag, err := tags.Get("ui")
|
|
|
|
if err == nil {
|
|
uiTags := append([]string{uiTag.Name}, uiTag.Options...)
|
|
for _, t := range uiTags {
|
|
analyzed := entities.NewMetadata(t)
|
|
if analyzed != nil {
|
|
metadata = append(metadata, *analyzed)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
startBacktick = len(field)
|
|
}
|
|
|
|
field = strings.TrimSpace(field[:startBacktick])
|
|
|
|
data := SplitBySingleSpace(field)
|
|
|
|
name := data[0]
|
|
dataType := data[1]
|
|
return &entities.Field{
|
|
Metadata: metadata,
|
|
Type: dataType,
|
|
Name: name,
|
|
}, nil
|
|
}
|