Skip to content

Commit

Permalink
Merge pull request #6 from NICEXAI/feat-tag-support
Browse files Browse the repository at this point in the history
feat: support set field tag name
  • Loading branch information
NICEXAI authored Dec 16, 2021
2 parents 9f60bde + 454cc52 commit c0f2c08
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 19 deletions.
3 changes: 2 additions & 1 deletion example/example.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ msg:
content: Hello
`

res, err = go2struct.YAML2Struct("message", []byte(temp))
// supports custom field tag name
res, err = go2struct.YAML2Struct("message", []byte(temp), "mapstructure")
if err != nil {
fmt.Printf("yaml to struct failed, error: \n%v", err)
return
Expand Down
4 changes: 2 additions & 2 deletions json2struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ package go2struct
import "encoding/json"

// JSON2Struct convert json to struct
func JSON2Struct(name string, data []byte) ([]byte, error) {
func JSON2Struct(name string, data []byte, args ...string) ([]byte, error) {
var m map[string]interface{}

if err := json.Unmarshal(data, &m); err != nil {
return nil, err
}

return Map2Struct(name, m), nil
return Map2Struct(name, m, args...), nil
}
34 changes: 21 additions & 13 deletions map2struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@ import (
)

const (
structFirst = "type "
structLast = "}"
structFirst = "type "
structLast = "}"
// $name $isSlice struct {
structStartTag = "%s %sstruct {\n"
structEndTag = "%s} `json:\"%s\"`\n"
structSpace = " "
structFieldTag = "%s%s %s `json:\"%s\"`\n"
// $space} `$tag:\"%name\"`\n"
structEndTag = "%s} `%s:\"%s\"`\n"
structSpace = " "
// $space $name $type `$tag:"$nameFormat"`
structFieldTag = "%s%s %s `%s:\"%s\"`\n"
)

// Map2Struct convert map to struct
func Map2Struct(name string, m map[string]interface{}) []byte {
cellNodes := convertMapToCellNode(name, m, false, 0)
func Map2Struct(name string, m map[string]interface{}, args ...string) []byte {
cellNodes := convertMapToCellNode(name, m, false, 0, args...)
structTxt, _ := util.FormatGoStruct(strings.Join(cellNodes, ""))
return []byte(structTxt)
}

func convertMapToCellNode(name string, m map[string]interface{}, isSlice bool, tier int) (cn []string) {
func convertMapToCellNode(name string, m map[string]interface{}, isSlice bool, tier int, args ...string) (cn []string) {
fmt.Println(args, 123)
tagName := "json"
if len(args) > 0 {
tagName = args[0]
}
if tier == 0 {
cn = append(cn, structFirst)
}
Expand Down Expand Up @@ -50,11 +58,11 @@ func convertMapToCellNode(name string, m map[string]interface{}, isSlice bool, t
}

if fType != "struct" && fType != "slice" {
cn = append(cn, fmt.Sprintf(structFieldTag, getSpaceByTier(tier), fName, fType, util.UpperCamelCaseToUnderscore(field)))
cn = append(cn, fmt.Sprintf(structFieldTag, getSpaceByTier(tier), fName, fType, tagName, util.UpperCamelCaseToUnderscore(field)))
}

if fType == "struct" {
child := convertMapToCellNode(field, val.(map[string]interface{}), false, tier+1)
child := convertMapToCellNode(field, val.(map[string]interface{}), false, tier+1, args...)
cn = append(cn, child...)
}

Expand All @@ -63,7 +71,7 @@ func convertMapToCellNode(name string, m map[string]interface{}, isSlice bool, t
if len(subList) > 0 {
fSubType := getFiledType(subList[0])
if fSubType != "struct" && fSubType != "slice" {
cn = append(cn, fmt.Sprintf(structFieldTag, getSpaceByTier(tier), fName, "[]"+fSubType, util.UpperCamelCaseToUnderscore(field)))
cn = append(cn, fmt.Sprintf(structFieldTag, getSpaceByTier(tier), fName, "[]"+fSubType, tagName, util.UpperCamelCaseToUnderscore(field)))
}
if fSubType == "struct" {
if sList, ok := subList[0].(map[interface{}]interface{}); ok {
Expand All @@ -76,7 +84,7 @@ func convertMapToCellNode(name string, m map[string]interface{}, isSlice bool, t
subList[0] = sNewVal
}

child := convertMapToCellNode(field, subList[0].(map[string]interface{}), true, tier+1)
child := convertMapToCellNode(field, subList[0].(map[string]interface{}), true, tier+1, args...)
cn = append(cn, child...)
}
}
Expand All @@ -86,7 +94,7 @@ func convertMapToCellNode(name string, m map[string]interface{}, isSlice bool, t
if tier == 0 {
cn = append(cn, structLast)
} else {
cn = append(cn, fmt.Sprintf(structEndTag, wrapperSpace, name))
cn = append(cn, fmt.Sprintf(structEndTag, wrapperSpace, tagName, name))
}
return cn
}
Expand Down
4 changes: 2 additions & 2 deletions yaml2struct.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ package go2struct
import "gopkg.in/yaml.v2"

// YAML2Struct convert yaml to struct
func YAML2Struct(name string, data []byte) ([]byte, error) {
func YAML2Struct(name string, data []byte, args ...string) ([]byte, error) {
var m map[string]interface{}

if err := yaml.Unmarshal(data, &m); err != nil {
return nil, err
}

return Map2Struct(name, m), nil
return Map2Struct(name, m, args...), nil
}
2 changes: 1 addition & 1 deletion yaml2struct_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ msg:
return
}
t.Logf("yaml to struct success, result: \n%s", res)
}
}

0 comments on commit c0f2c08

Please sign in to comment.