|
28 | 28 | parentResolvedMap = map[*descriptorpb.DescriptorProto]bool{}
|
29 | 29 | )
|
30 | 30 |
|
| 31 | +type PackageFileGroup struct { |
| 32 | + name string |
| 33 | + fullName string |
| 34 | + files []*descriptorpb.FileDescriptorProto |
| 35 | + subPackages map[string]*PackageFileGroup |
| 36 | +} |
| 37 | + |
31 | 38 | func main() {
|
32 | 39 | pflag.Parse()
|
33 | 40 | if *pTemplate == "" || *pOutput == "" {
|
@@ -68,47 +75,72 @@ func main() {
|
68 | 75 | buf.Printf(string(templateContent))
|
69 | 76 |
|
70 | 77 | // 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{}, |
77 | 80 | }
|
78 |
| - |
79 |
| - for pkg, packageFiles := range packageFileGroups { |
| 81 | + for _, file := range files { |
| 82 | + pkg := file.GetPackage() |
80 | 83 | var paths []string
|
81 | 84 | if pkg != *pPackage {
|
82 | 85 | 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 |
83 | 92 | 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] |
85 | 101 | }
|
| 102 | + currentGroup.files = append(currentGroup.files, file) |
86 | 103 | }
|
87 |
| - indentLevel := len(paths) |
88 | 104 |
|
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 { |
90 | 117 | for _, enum := range file.EnumType {
|
91 |
| - oneprotou_til.GenerateEnum(buf, indentLevel, enum) |
| 118 | + oneprotou_til.GenerateEnum(buf, identLevel+1, enum) |
92 | 119 | buf.Printf("")
|
93 | 120 | }
|
94 | 121 |
|
95 | 122 | for _, service := range file.Service {
|
96 |
| - oneprotou_til.GenerateService(buf, indentLevel, service) |
| 123 | + oneprotou_til.GenerateService(buf, identLevel+1, service) |
97 | 124 | buf.Printf("")
|
98 | 125 | }
|
99 | 126 |
|
100 | 127 | 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) |
103 | 130 | buf.Printf("")
|
104 | 131 | }
|
105 | 132 | }
|
106 | 133 |
|
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)) |
109 | 139 | }
|
110 | 140 | buf.Printf("")
|
111 | 141 | }
|
| 142 | + iteratePackageGroup(packageFileGroup, -1) |
| 143 | + |
112 | 144 | if err := os.WriteFile(*pOutput, buf.Bytes(), 0644); err != nil {
|
113 | 145 | log.Fatalln(err)
|
114 | 146 | }
|
|
0 commit comments