Skip to content

Commit 35cfbc5

Browse files
committed
merge nested namespaces
1 parent ea34c37 commit 35cfbc5

File tree

4 files changed

+84
-19
lines changed

4 files changed

+84
-19
lines changed

example/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
.PHONY: all
22
all:
33
go install github.com/joesonw/oneproto
4-
oneproto -I ./proto -O output.proto -T template.proto -P example.com ./proto
4+
oneproto --options -I ./proto -O output.proto -T template.proto -P example.com ./proto

example/output.proto

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,18 @@ message Base {
1313

1414
// extends example.com.Base
1515
message Intermediate {
16+
option (test) = 'hello';
17+
1618
int64 id = 1;
1719
int64 createdAt = 2;
1820
int64 updatedAt = 3;
1921
}
2022

21-
2223
message groups {
2324
// extends example.com.Intermediate
2425
message Group {
26+
option (test) = 'hello';
27+
2528
int64 id = 1;
2629
int64 createdAt = 2;
2730
int64 updatedAt = 3;
@@ -34,6 +37,8 @@ message groups {
3437
message users {
3538
// extends example.com.Intermediate
3639
message User {
40+
option (test) = 'hello';
41+
3742
int64 id = 1;
3843
int64 createdAt = 2;
3944
int64 updatedAt = 3;
@@ -43,5 +48,19 @@ message users {
4348
repeated groups.Group groups = 14;
4449
}
4550

51+
message nested {
52+
// extends example.com.Intermediate
53+
message Test {
54+
option (test) = 'hello';
55+
56+
int64 id = 1;
57+
int64 createdAt = 2;
58+
int64 updatedAt = 3;
59+
string name = 11;
60+
}
61+
62+
}
63+
4664
}
4765

66+

example/proto/nested.proto

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
syntax = 'proto3';
2+
option go_package = 'generated/proto;pb';
3+
4+
package example.com.users.nested;
5+
6+
import "proto/group.proto";
7+
import "oneproto.proto";
8+
9+
10+
message Test {
11+
option (oneproto.extends) = 'example.com.Intermediate';
12+
13+
string name = 11;
14+
}

main.go

Lines changed: 49 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ var (
2828
parentResolvedMap = map[*descriptorpb.DescriptorProto]bool{}
2929
)
3030

31+
type PackageFileGroup struct {
32+
name string
33+
fullName string
34+
files []*descriptorpb.FileDescriptorProto
35+
subPackages map[string]*PackageFileGroup
36+
}
37+
3138
func main() {
3239
pflag.Parse()
3340
if *pTemplate == "" || *pOutput == "" {
@@ -68,47 +75,72 @@ func main() {
6875
buf.Printf(string(templateContent))
6976

7077
// group files by package name
71-
packageFileGroups := make(map[string][]*descriptorpb.FileDescriptorProto)
72-
for _, file := range files {
73-
packageFileGroups[file.GetPackage()] = append(packageFileGroups[file.GetPackage()], file)
74-
for _, message := range file.GetMessageType() {
75-
allMessageDescriptors[trimPackageFromName(fmt.Sprintf("%s.%s", file.GetPackage(), message.GetName()))] = message
76-
}
78+
packageFileGroup := &PackageFileGroup{
79+
subPackages: map[string]*PackageFileGroup{},
7780
}
78-
79-
for pkg, packageFiles := range packageFileGroups {
81+
for _, file := range files {
82+
pkg := file.GetPackage()
8083
var paths []string
8184
if pkg != *pPackage {
8285
paths = strings.Split(trimPackageFromName(pkg), ".")
86+
}
87+
88+
if len(paths) == 0 {
89+
packageFileGroup.files = append(packageFileGroup.files, file)
90+
} else {
91+
var currentGroup = packageFileGroup
8392
for i, path := range paths {
84-
buf.Printf("%smessage %s {", strings.Repeat(" ", i*4), path)
93+
if currentGroup.subPackages[path] == nil {
94+
currentGroup.subPackages[path] = &PackageFileGroup{
95+
name: path,
96+
fullName: strings.Join(paths[:i+1], "."),
97+
subPackages: map[string]*PackageFileGroup{},
98+
}
99+
}
100+
currentGroup = currentGroup.subPackages[path]
85101
}
102+
currentGroup.files = append(currentGroup.files, file)
86103
}
87-
indentLevel := len(paths)
88104

89-
for _, file := range packageFiles {
105+
for _, message := range file.GetMessageType() {
106+
allMessageDescriptors[trimPackageFromName(fmt.Sprintf("%s.%s", file.GetPackage(), message.GetName()))] = message
107+
}
108+
}
109+
110+
var iteratePackageGroup func(group *PackageFileGroup, identLevel int)
111+
iteratePackageGroup = func(group *PackageFileGroup, identLevel int) {
112+
if group.name != "" {
113+
buf.Printf("%smessage %s {", strings.Repeat(" ", identLevel*4), group.name)
114+
}
115+
116+
for _, file := range group.files {
90117
for _, enum := range file.EnumType {
91-
oneprotou_til.GenerateEnum(buf, indentLevel, enum)
118+
oneprotou_til.GenerateEnum(buf, identLevel+1, enum)
92119
buf.Printf("")
93120
}
94121

95122
for _, service := range file.Service {
96-
oneprotou_til.GenerateService(buf, indentLevel, service)
123+
oneprotou_til.GenerateService(buf, identLevel+1, service)
97124
buf.Printf("")
98125
}
99126

100127
for _, message := range file.GetMessageType() {
101-
resolveMessageExtends(buf, indentLevel, message)
102-
oneprotou_til.GenerateMessage(buf, indentLevel, message)
128+
resolveMessageExtends(buf, identLevel+1, message)
129+
oneprotou_til.GenerateMessage(buf, identLevel+1, message)
103130
buf.Printf("")
104131
}
105132
}
106133

107-
for i := range paths {
108-
buf.Printf("%s}", strings.Repeat(" ", i*4))
134+
for _, subPackage := range group.subPackages {
135+
iteratePackageGroup(subPackage, identLevel+1)
136+
}
137+
if group.name != "" {
138+
buf.Printf("%s}", strings.Repeat(" ", identLevel*4))
109139
}
110140
buf.Printf("")
111141
}
142+
iteratePackageGroup(packageFileGroup, -1)
143+
112144
if err := os.WriteFile(*pOutput, buf.Bytes(), 0644); err != nil {
113145
log.Fatalln(err)
114146
}

0 commit comments

Comments
 (0)