@@ -18,6 +18,7 @@ import (
18
18
"bytes"
19
19
"fmt"
20
20
"io"
21
+ "os/exec"
21
22
"path/filepath"
22
23
"sort"
23
24
"strings"
@@ -125,27 +126,43 @@ func generatePackage(ctx *context, w io.Writer) error {
125
126
// generate enums
126
127
if len (ctx .packageData .Enums ) > 0 {
127
128
for _ , enum := range ctx .packageData .Enums {
129
+ if imp , ok := ctx .packageData .Imports [enum .Name ]; ok {
130
+ generateImportedAlias (ctx , w , enum .Name , & imp )
131
+ continue
132
+ }
128
133
generateEnum (ctx , w , & enum )
129
134
}
130
135
}
131
136
132
137
// generate aliases
133
138
if len (ctx .packageData .Aliases ) > 0 {
134
139
for _ , alias := range ctx .packageData .Aliases {
140
+ if imp , ok := ctx .packageData .Imports [alias .Name ]; ok {
141
+ generateImportedAlias (ctx , w , alias .Name , & imp )
142
+ continue
143
+ }
135
144
generateAlias (ctx , w , & alias )
136
145
}
137
146
}
138
147
139
148
// generate types
140
149
if len (ctx .packageData .Types ) > 0 {
141
150
for _ , typ := range ctx .packageData .Types {
151
+ if imp , ok := ctx .packageData .Imports [typ .Name ]; ok {
152
+ generateImportedAlias (ctx , w , typ .Name , & imp )
153
+ continue
154
+ }
142
155
generateType (ctx , w , & typ )
143
156
}
144
157
}
145
158
146
159
// generate unions
147
160
if len (ctx .packageData .Unions ) > 0 {
148
161
for _ , union := range ctx .packageData .Unions {
162
+ if imp , ok := ctx .packageData .Imports [union .Name ]; ok {
163
+ generateImportedAlias (ctx , w , union .Name , & imp )
164
+ continue
165
+ }
149
166
generateUnion (ctx , w , & union )
150
167
}
151
168
}
@@ -224,10 +241,42 @@ func generateHeader(ctx *context, w io.Writer) {
224
241
fmt .Fprintf (w , "\t io \" %s\" \n " , "io" )
225
242
fmt .Fprintf (w , "\t strconv \" %s\" \n " , "strconv" )
226
243
fmt .Fprintf (w , "\t struc \" %s\" \n " , "github.com/lunixbochs/struc" )
244
+ if len (ctx .packageData .Imports ) > 0 {
245
+ fmt .Fprintln (w )
246
+ for _ , imp := range getImports (ctx ) {
247
+ impPkg := getImportPkg (filepath .Dir (ctx .outputFile ), imp )
248
+ fmt .Fprintf (w , "\t %s \" %s\" \n " , imp , strings .TrimSpace (impPkg ))
249
+ }
250
+ }
227
251
fmt .Fprintln (w , ")" )
228
252
fmt .Fprintln (w )
229
253
}
230
254
255
+ func getImportPkg (outputDir string , pkg string ) string {
256
+ absPath , _ := filepath .Abs (filepath .Join (outputDir , ".." , pkg ))
257
+ cmd := exec .Command ("go" , "list" , absPath )
258
+ var errbuf , outbuf bytes.Buffer
259
+ cmd .Stdout = & outbuf
260
+ cmd .Stderr = & errbuf
261
+ if err := cmd .Run (); err != nil {
262
+ fmt .Printf ("ERR: %v\n " , errbuf .String ())
263
+ panic (err )
264
+ }
265
+ return outbuf .String ()
266
+ }
267
+
268
+ func getImports (ctx * context ) (imports []string ) {
269
+ impmap := map [string ]struct {}{}
270
+ for _ , imp := range ctx .packageData .Imports {
271
+ if _ , ok := impmap [imp .Package ]; ! ok {
272
+ imports = append (imports , imp .Package )
273
+ impmap [imp .Package ] = struct {}{}
274
+ }
275
+ }
276
+ sort .Strings (imports )
277
+ return imports
278
+ }
279
+
231
280
func generateFooter (ctx * context , w io.Writer ) {
232
281
fmt .Fprintln (w , "// This is a compile-time assertion to ensure that this generated file" )
233
282
fmt .Fprintln (w , "// is compatible with the GoVPP api package it is being compiled against." )
@@ -350,6 +399,14 @@ func generateEnum(ctx *context, w io.Writer, enum *Enum) {
350
399
fmt .Fprintln (w )
351
400
}
352
401
402
+ func generateImportedAlias (ctx * context , w io.Writer , tName string , imp * Import ) {
403
+ name := camelCaseName (tName )
404
+
405
+ fmt .Fprintf (w , "type %s = %s.%s\n " , name , imp .Package , name )
406
+
407
+ fmt .Fprintln (w )
408
+ }
409
+
353
410
func generateAlias (ctx * context , w io.Writer , alias * Alias ) {
354
411
name := camelCaseName (alias .Name )
355
412
@@ -550,13 +607,10 @@ func generateMessage(ctx *context, w io.Writer, msg *Message) {
550
607
// generate end of the struct
551
608
fmt .Fprintln (w , "}" )
552
609
553
- // generate name getter
610
+ // generate message methods
611
+ generateMessageResetMethod (w , name )
554
612
generateMessageNameGetter (w , name , msg .Name )
555
-
556
- // generate CRC getter
557
613
generateCrcGetter (w , name , msg .CRC )
558
-
559
- // generate message type getter method
560
614
generateMessageTypeGetter (w , name , msgType )
561
615
562
616
fmt .Fprintln (w )
@@ -637,40 +691,36 @@ func generateField(ctx *context, w io.Writer, fields []Field, i int) {
637
691
fmt .Fprintln (w )
638
692
}
639
693
640
- func generateMessageNameGetter (w io.Writer , structName , msgName string ) {
641
- fmt .Fprintf (w , `func (*%s) GetMessageName() string {
642
- return %q
694
+ func generateMessageResetMethod (w io.Writer , structName string ) {
695
+ fmt .Fprintf (w , "func (m *%[1]s) Reset() { *m = %[1]s{} }\n " , structName )
643
696
}
644
- ` , structName , msgName )
697
+
698
+ func generateMessageNameGetter (w io.Writer , structName , msgName string ) {
699
+ fmt .Fprintf (w , "func (*%s) GetMessageName() string { return %q }\n " , structName , msgName )
645
700
}
646
701
647
702
func generateTypeNameGetter (w io.Writer , structName , msgName string ) {
648
- fmt .Fprintf (w , `func (*%s) GetTypeName() string {
649
- return %q
650
- }
651
- ` , structName , msgName )
703
+ fmt .Fprintf (w , "func (*%s) GetTypeName() string { return %q }\n " , structName , msgName )
652
704
}
653
705
654
706
func generateCrcGetter (w io.Writer , structName , crc string ) {
655
707
crc = strings .TrimPrefix (crc , "0x" )
656
- fmt .Fprintf (w , `func (*%s) GetCrcString() string {
657
- return %q
658
- }
659
- ` , structName , crc )
708
+ fmt .Fprintf (w , "func (*%s) GetCrcString() string { return %q }\n " , structName , crc )
660
709
}
661
710
662
711
func generateMessageTypeGetter (w io.Writer , structName string , msgType MessageType ) {
663
- fmt .Fprintln (w , "func (*" + structName + ") GetMessageType() api.MessageType {" )
712
+ fmt .Fprintf (w , "func (*" + structName + ") GetMessageType() api.MessageType {" )
664
713
if msgType == requestMessage {
665
- fmt .Fprintln (w , "\t return api.RequestMessage" )
714
+ fmt .Fprintf (w , "\t return api.RequestMessage" )
666
715
} else if msgType == replyMessage {
667
- fmt .Fprintln (w , "\t return api.ReplyMessage" )
716
+ fmt .Fprintf (w , "\t return api.ReplyMessage" )
668
717
} else if msgType == eventMessage {
669
- fmt .Fprintln (w , "\t return api.EventMessage" )
718
+ fmt .Fprintf (w , "\t return api.EventMessage" )
670
719
} else {
671
- fmt .Fprintln (w , "\t return api.OtherMessage" )
720
+ fmt .Fprintf (w , "\t return api.OtherMessage" )
672
721
}
673
722
fmt .Fprintln (w , "}" )
723
+ fmt .Fprintln (w )
674
724
}
675
725
676
726
func generateServices (ctx * context , w io.Writer , services []Service ) {
0 commit comments