Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(goctl): better generate the api code of typescript #2483

Merged
merged 1 commit into from Oct 11, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 15 additions & 0 deletions tools/goctl/api/spec/example_test.go
@@ -0,0 +1,15 @@
package spec_test

import (
"fmt"
"github.com/zeromicro/go-zero/tools/goctl/api/spec"
)

func ExampleMember_GetEnumOptions() {
member := spec.Member{
Tag: `json:"foo,options=foo|bar|options|123"`,
}
fmt.Println(member.GetEnumOptions())
// Output:
// [foo bar options 123]
}
21 changes: 21 additions & 0 deletions tools/goctl/api/spec/fn.go
Expand Up @@ -154,6 +154,27 @@ func (m Member) IsTagMember(tagKey string) bool {
return false
}

// GetEnumOptions return a slice contains all enumeration options
func (m Member) GetEnumOptions() []string {
if !m.IsBodyMember() {
return nil
}

tags := m.Tags()
for _, tag := range tags {
if tag.Key == bodyTagKey {
options := tag.Options
for _, option := range options {
if strings.Index(option, "options=") == 0 {
option = strings.TrimPrefix(option, "options=")
return strings.Split(option, "|")
}
}
}
}
return nil
}

// GetBodyMembers returns all json fields
func (t DefineStruct) GetBodyMembers() []Member {
var result []Member
Expand Down
15 changes: 14 additions & 1 deletion tools/goctl/api/tsgen/util.go
Expand Up @@ -19,7 +19,7 @@ const (

func writeProperty(writer io.Writer, member spec.Member, indent int) error {
writeIndent(writer, indent)
ty, err := goTypeToTs(member.Type, false)
ty, err := genTsType(member)
if err != nil {
return err
}
Expand Down Expand Up @@ -52,6 +52,19 @@ func writeIndent(writer io.Writer, indent int) {
}
}

func genTsType(m spec.Member) (ty string, err error) {
ty, err = goTypeToTs(m.Type, false)
if enums := m.GetEnumOptions(); enums != nil {
if ty == "string" {
for i := range enums {
enums[i] = "'" + enums[i] + "'"
}
}
ty = strings.Join(enums, " | ")
}
return
}

func goTypeToTs(tp spec.Type, fromPacket bool) (string, error) {
switch v := tp.(type) {
case spec.DefineStruct:
Expand Down
38 changes: 38 additions & 0 deletions tools/goctl/api/tsgen/util_test.go
@@ -0,0 +1,38 @@
package tsgen

import (
"github.com/stretchr/testify/assert"
"github.com/zeromicro/go-zero/tools/goctl/api/spec"
"testing"
)

func TestGenTsType(t *testing.T) {
member := spec.Member{
Name: "foo",
Type: spec.PrimitiveType{RawName: "string"},
Tag: `json:"foo,options=foo|bar|options|123"`,
Comment: "",
Docs: nil,
IsInline: false,
}
ty, err := genTsType(member)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, `'foo' | 'bar' | 'options' | '123'`, ty)

member.IsInline = true
ty, err = genTsType(member)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, `'foo' | 'bar' | 'options' | '123'`, ty)

member.Type = spec.PrimitiveType{RawName: "int"}
member.Tag = `json:"foo,options=1|3|4|123"`
ty, err = genTsType(member)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, `1 | 3 | 4 | 123`, ty)
}