@@ -49,22 +49,38 @@ func writeProgram(importPath string, symbols []string) ([]byte, error) {
49
49
return program .Bytes (), nil
50
50
}
51
51
52
- // run the given command and parse the output as a model.Package.
53
- func run (command string ) (* model.Package , error ) {
52
+ // run the given program and parse the output as a model.Package.
53
+ func run (program string ) (* model.Package , error ) {
54
+ f , err := ioutil .TempFile ("" , "" )
55
+ filename := f .Name ()
56
+ defer os .Remove (filename )
57
+ if err := f .Close (); err != nil {
58
+ return nil , err
59
+ }
60
+
54
61
// Run the program.
55
- cmd := exec .Command (command )
56
- var stdout bytes.Buffer
57
- cmd .Stdout = & stdout
62
+ cmd := exec .Command (program , "-output" , filename )
63
+ cmd .Stdout = os .Stdout
58
64
cmd .Stderr = os .Stderr
59
65
if err := cmd .Run (); err != nil {
60
66
return nil , err
61
67
}
62
68
69
+ f , err = os .Open (filename )
70
+ if err != nil {
71
+ return nil , err
72
+ }
73
+
63
74
// Process output.
64
75
var pkg model.Package
65
- if err := gob .NewDecoder (& stdout ).Decode (& pkg ); err != nil {
76
+ if err := gob .NewDecoder (f ).Decode (& pkg ); err != nil {
77
+ return nil , err
78
+ }
79
+
80
+ if err := f .Close (); err != nil {
66
81
return nil , err
67
82
}
83
+
68
84
return & pkg , nil
69
85
}
70
86
@@ -154,6 +170,7 @@ package main
154
170
155
171
import (
156
172
"encoding/gob"
173
+ "flag"
157
174
"fmt"
158
175
"os"
159
176
"path"
@@ -164,7 +181,11 @@ import (
164
181
pkg_ {{printf "%q" .ImportPath}}
165
182
)
166
183
184
+ var output = flag.String("output", "", "The output file name, or empty to use stdout.")
185
+
167
186
func main() {
187
+ flag.Parse()
188
+
168
189
its := []struct{
169
190
sym string
170
191
typ reflect.Type
@@ -189,7 +210,23 @@ func main() {
189
210
intf.Name = it.sym
190
211
pkg.Interfaces = append(pkg.Interfaces, intf)
191
212
}
192
- if err := gob.NewEncoder(os.Stdout).Encode(pkg); err != nil {
213
+
214
+ outfile := os.Stdout
215
+ if len(*output) != 0 {
216
+ var err error
217
+ outfile, err = os.Create(*output)
218
+ if err != nil {
219
+ fmt.Fprintf(os.Stderr, "failed to open output file %q", *output)
220
+ }
221
+ defer func() {
222
+ if err := outfile.Close(); err != nil {
223
+ fmt.Fprintf(os.Stderr, "failed to close output file %q", *output)
224
+ os.Exit(1)
225
+ }
226
+ }()
227
+ }
228
+
229
+ if err := gob.NewEncoder(outfile).Encode(pkg); err != nil {
193
230
fmt.Fprintf(os.Stderr, "gob encode: %v\n", err)
194
231
os.Exit(1)
195
232
}
0 commit comments