From a1df30a318416357b4003a444c475eda8c26bad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=92=D0=B0=D1=81=D0=B8=D0=BB=D0=B8=D0=B9=20=D0=98=D0=BB?= =?UTF-8?q?=D0=BB=D0=B0=D1=80=D0=B8=D0=BE=D0=BD=D0=BE=D0=B2=D0=B8=D1=87?= Date: Thu, 13 Feb 2025 19:21:14 +0700 Subject: [PATCH] feat: tag parsing --- .gitignore | 2 ++ {types => entities}/field.go | 6 +----- entities/metadata.go | 31 +++++++++++++++++++++++++++++++ example_structs/post.go | 2 +- main.go | 2 +- utils/get_struct_fields.go | 6 +++--- utils/split_struct_field.go | 19 ++++++++++++------- 7 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 .gitignore rename {types => entities}/field.go (51%) create mode 100644 entities/metadata.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3a7f03 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +main +main.exe \ No newline at end of file diff --git a/types/field.go b/entities/field.go similarity index 51% rename from types/field.go rename to entities/field.go index d300bce..bbef5bb 100644 --- a/types/field.go +++ b/entities/field.go @@ -1,4 +1,4 @@ -package types +package entities type Field struct { Name string @@ -6,7 +6,3 @@ type Field struct { Medatada []Medatada } -type Medatada struct { - Name string - Values []string -} \ No newline at end of file diff --git a/entities/metadata.go b/entities/metadata.go new file mode 100644 index 0000000..9a9ba91 --- /dev/null +++ b/entities/metadata.go @@ -0,0 +1,31 @@ +package entities + +import "strings" + +type Medatada struct { + Name string + Values []string +} + +func NewMetadata(tag string) *Medatada { + tag = strings.TrimSpace(tag) + tagName := "" + var values []string + if strings.Contains(tag, "=") { + tagName = tag[:strings.Index(tag, "=")] + if tag[strings.Index(tag, "=") + 1] == '[' { + values = append(values, strings.Split(tag[strings.Index(tag, "=") + 2:len(tag)-1], ";")...) + for i := range values { + values[i] = strings.TrimSpace(values[i]) + } + } else { + values = append(values, strings.TrimSpace(tag[strings.Index(tag, "=") + 1:])) + } + } else { + tagName = tag + } + return &Medatada{ + Name: strings.TrimSpace(strings.ToLower(tagName)), + Values: values, + } +} \ No newline at end of file diff --git a/example_structs/post.go b/example_structs/post.go index 50c0a7f..9a04eb8 100644 --- a/example_structs/post.go +++ b/example_structs/post.go @@ -1,5 +1,5 @@ package structs type Post struct { - title string `ui:",hidden,asd"` + title string `ui:"hidden,asd,ass=[s;s]"` } \ No newline at end of file diff --git a/main.go b/main.go index f196b40..abaf8cc 100644 --- a/main.go +++ b/main.go @@ -18,5 +18,5 @@ func main() { structFields := utils.GetStructFields(file, structName) - fmt.Println(structFields) + fmt.Printf("%+v\n", structFields) } \ No newline at end of file diff --git a/utils/get_struct_fields.go b/utils/get_struct_fields.go index dd938a1..c8b5580 100644 --- a/utils/get_struct_fields.go +++ b/utils/get_struct_fields.go @@ -2,17 +2,17 @@ package utils import ( "bufio" - "nto_cli/types" + "nto_cli/entities" "os" "strings" ) -func GetStructFields(file *os.File, structName string) []types.Field { +func GetStructFields(file *os.File, structName string) []entities.Field { bracketsCount := 1 structFound := false - structFields := []types.Field{} + structFields := []entities.Field{} scanner := bufio.NewScanner(file) for i := 1; scanner.Scan() && bracketsCount > 0; i++ { diff --git a/utils/split_struct_field.go b/utils/split_struct_field.go index 14f6c94..4a9221d 100644 --- a/utils/split_struct_field.go +++ b/utils/split_struct_field.go @@ -1,21 +1,20 @@ package utils import ( - "fmt" - "nto_cli/types" + "nto_cli/entities" "strings" "github.com/fatih/structtag" ) -func SplitStructField(field string) *types.Field { +func SplitStructField(field string) *entities.Field { if strings.Contains(field, "type") { return nil } startBacktip := strings.Index(field, "`") endBacktip := -1 - var metadata []types.Medatada + var metadata []entities.Medatada if startBacktip > -1 { endBacktip = strings.Index(field[startBacktip + 1:], "`") if endBacktip > -1 { @@ -25,11 +24,17 @@ func SplitStructField(field string) *types.Field { if err != nil { panic(err) } - uiTags, err := tags.Get("ui") + uiTag, err := tags.Get("ui") if err != nil { panic(err) } - fmt.Printf("%+v\n", uiTags.Options) + uiTags := append([]string{uiTag.Name}, uiTag.Options...) + for _, t := range uiTags { + analyzed := entities.NewMetadata(t) + if analyzed != nil { + metadata = append(metadata, *analyzed) + } + } } } else { startBacktip = len(field) @@ -48,7 +53,7 @@ func SplitStructField(field string) *types.Field { dataType := strings.TrimSpace(data[1]) - return &types.Field{ + return &entities.Field{ Medatada: metadata, Type: dataType, Name: name,