Skip to content

Commit

Permalink
add jy2struct package
Browse files Browse the repository at this point in the history
  • Loading branch information
zhufuyi committed Aug 30, 2022
1 parent 8d591c6 commit 309a78f
Show file tree
Hide file tree
Showing 7 changed files with 715 additions and 0 deletions.
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -39,12 +39,16 @@
- [gohttp http客户端](gohttp)
- [goredis redis客户端](goredis)
- [jwt 鉴权](jwt)
- [jy2struct json或yaml转struct](jy2struct)
- [krand 随机数和字符串生成器](krand)
- [logger 日志](logger)
- [mconf 文本处理](mconf)
- [mongo 客户端](mongo)
- [mysql 客户端](mysql)
- [nats 客户端](nats)
- [redis 客户端](redis)
- [replacer 替换模板内容](replacer)
- [snowflake id生成器](snowflake)
- [sql2code 根据sql生成不同用途代码](sql2code)
- [tracer 链路跟踪](tracer)
- [utils](utils)
46 changes: 46 additions & 0 deletions jy2struct/README.md
@@ -0,0 +1,46 @@
## jy2struct

json和yaml转go struct代码。

<br>

### 安装

> go get -u github.com/zhufuyi/pkg/jy2struct
<br>

### 使用示例

主要设置参数:

```go
type Args struct {
Format string // 文档格式,json或yaml
Data string // json或yaml内容
InputFile string // 文件
Name string // 结构体名称
SubStruct bool // 子结构体是否分开
Tags string // 添加额外tag,多个tag用逗号分隔
}
```

<br>

转换示例:

```go
// json转struct
code, err := jy2struct.Covert(&jy2struct.Args{
Format: "json",
// InputFile: "user.json", // 来源于json文件
SubStruct: true,
})

// json转struct
code, err := jy2struct.Covert(&jy2struct.Args{
Format: "yaml",
// InputFile: "user.yaml", // 来源于yaml文件
SubStruct: true,
})
```
77 changes: 77 additions & 0 deletions jy2struct/covert.go
@@ -0,0 +1,77 @@
package jy2struct

import (
"bytes"
"errors"
"io/ioutil"
"strings"
)

// Args 参数
type Args struct {
Format string // 文档格式,json或yaml
Data string // json或yaml内容
InputFile string // 文件
Name string // 结构体名称
SubStruct bool // 子结构体是否分开
Tags string // 字段tag,多个tag用逗号分隔

tags []string
convertFloats bool
parser Parser
}

func (j *Args) checkValid() error {
switch j.Format {
case "json":
j.parser = ParseJson
j.convertFloats = true
case "yaml":
j.parser = ParseYaml
default:
return errors.New("format must be json or yaml")
}

j.tags = []string{j.Format}
tags := strings.Split(j.Tags, ",")
for _, tag := range tags {
if tag == j.Format || tag == "" {
continue
}
j.tags = append(j.tags, tag)
}

if j.Name == "" {
j.Name = "GenerateName"
}

return nil
}

// Covert json或yaml转go struct
func Covert(args *Args) (string, error) {
err := args.checkValid()
if err != nil {
return "", err
}

var data []byte
if args.Data != "" {
data = []byte(args.Data)
} else {
// 读取文件
data, err = ioutil.ReadFile(args.InputFile)
if err != nil {
return "", err
}
}

input := bytes.NewReader(data)

output, err := Generate(input, args.parser, args.Name, "main", args.tags, args.SubStruct, args.convertFloats)
if err != nil {
return "", err
}

return string(output), nil
}
63 changes: 63 additions & 0 deletions jy2struct/covert_test.go
@@ -0,0 +1,63 @@
package jy2struct

import "testing"

func TestCovert(t *testing.T) {
type args struct {
args *Args
}
tests := []struct {
name string
args args
wantErr bool
}{
{
name: "json to struct from data",
args: args{args: &Args{
Data: `{"name":"zhangsan","age":22}`,
Format: "json",
}},
wantErr: false,
},
{
name: "yaml to struct from data",
args: args{args: &Args{
Data: `
name": zhangsan
first_name: zhu
age: 10
`,
Format: "yaml",
}},
wantErr: false,
},
{
name: "json to struct from file",
args: args{args: &Args{
InputFile: "test.json",
Format: "json",
SubStruct: true,
}},
wantErr: false,
},
{
name: "yaml to struct from file",
args: args{args: &Args{
InputFile: "test.yaml",
Format: "yaml",
SubStruct: true,
}},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := Covert(tt.args.args)
if (err != nil) != tt.wantErr {
t.Errorf("Covert() error = %v, wantErr %v", err, tt.wantErr)
return
}
t.Log(got)
})
}
}

0 comments on commit 309a78f

Please sign in to comment.