Skip to content

Commit

Permalink
add filter flag support
Browse files Browse the repository at this point in the history
  • Loading branch information
anjmao committed Mar 21, 2019
1 parent 6f93ad8 commit a5f726f
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 22 deletions.
12 changes: 9 additions & 3 deletions example/in/model.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,27 @@
package in

type User struct{}

type EventSubForm struct {
Id string
ID string

Caption string

Rank int32

Fields *ArrayOfEventField

User User

PrimitivePointer *int
}

type ArrayOfEventField struct {
EventField []*EventField
}

type EventField struct {
Id string
ID string

Name string

Expand All @@ -37,7 +43,7 @@ type ArrayOfEventFieldItem struct {
}

type EventFieldItem struct {
Id string
EventFieldItemID string

Text string

Expand Down
27 changes: 16 additions & 11 deletions example/out/output.proto
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,12 @@ syntax = "proto3";
package proto;


message ArrayOfEventFieldItem {
repeated EventFieldItem eventFieldItem = 1;
message ArrayOfEventField {
repeated EventField eventField = 1;
}

message EventSubForm {
string id = 1;
string caption = 2;
int32 rank = 3;
ArrayOfEventField fields = 4;
message ArrayOfEventFieldItem {
repeated EventFieldItem eventFieldItem = 1;
}

message EventField {
Expand All @@ -24,13 +21,21 @@ message EventField {
int32 customFieldOrder = 8;
}

message ArrayOfEventField {
repeated EventField eventField = 1;
message EventFieldItem {
string eventFieldItemID = 1;
string text = 2;
int32 rank = 3;
}

message EventFieldItem {
message EventSubForm {
string id = 1;
string text = 2;
string caption = 2;
int32 rank = 3;
ArrayOfEventField fields = 4;
User user = 5;
int64 primitivePointer = 6;
}

message User {
}

43 changes: 35 additions & 8 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"log"
"os"
"path/filepath"
"sort"
"strings"
"text/template"
"unicode"
Expand All @@ -26,6 +27,7 @@ func (i *arrFlags) Set(value string) error {
}

var (
filter = flag.String("filter", "", "Filter struct names.")
protoFolder = flag.String("f", "", "Proto output path.")
pkgFlags arrFlags
)
Expand Down Expand Up @@ -53,7 +55,7 @@ func main() {
log.Fatal(err)
}

msgs := getMessages(pkgs)
msgs := getMessages(pkgs, *filter)

if err := writeOutput(msgs, *protoFolder); err != nil {
log.Fatal(err)
Expand Down Expand Up @@ -87,8 +89,9 @@ type field struct {
IsRepeated bool
}

func getMessages(pkgs []*packages.Package) []*message {
out := []*message{}
func getMessages(pkgs []*packages.Package, filter string) []*message {
var out []*message
seen := map[string]struct{}{}
for _, p := range pkgs {
for _, t := range p.TypesInfo.Defs {
if t == nil {
Expand All @@ -97,12 +100,18 @@ func getMessages(pkgs []*packages.Package) []*message {
if !t.Exported() {
continue
}
if _, ok := seen[t.Name()]; ok {
continue
}
if s, ok := t.Type().Underlying().(*types.Struct); ok {
out = appendMessage(out, t, s)
seen[t.Name()] = struct{}{}
if filter == "" || strings.Contains(t.Name(), filter) {
out = appendMessage(out, t, s)
}
}
}

}
sort.Slice(out, func(i, j int) bool { return out[i].Name < out[j].Name })
return out
}

Expand Down Expand Up @@ -132,20 +141,38 @@ func appendMessage(out []*message, t types.Object, s *types.Struct) []*message {
func toProtoFieldTypeName(f *types.Var) string {
switch f.Type().Underlying().(type) {
case *types.Basic:
return f.Type().String()
case *types.Slice, *types.Pointer:
name := f.Type().String()
return normalizeType(name)
case *types.Slice, *types.Pointer, *types.Struct:
// TODO: this is ugly. Find another way of getting field type name.
parts := strings.Split(f.Type().String(), ".")
return parts[len(parts)-1]
name := parts[len(parts)-1]
if name[0] == '*' {
name = name[1:]
}
return normalizeType(name)
}
return f.Type().String()
}

func normalizeType(name string) string {
switch name {
case "int":
return "int64"
default:
return name
}
}

func isRepeated(f *types.Var) bool {
_, ok := f.Type().Underlying().(*types.Slice)
return ok
}

func toProtoFieldName(name string) string {
if len(name) == 2 {
return strings.ToLower(name)
}
r, n := utf8.DecodeRuneInString(name)
return string(unicode.ToLower(r)) + name[n:]
}
Expand Down

0 comments on commit a5f726f

Please sign in to comment.