Skip to content

Commit 084850e

Browse files
committed
Inlining methods in ArduinoCoreServiceImpl (part 14: Upload, UploadUsingProgrammer, BurnBootloader)
1 parent b76847f commit 084850e

File tree

6 files changed

+122
-102
lines changed

6 files changed

+122
-102
lines changed

Diff for: commands/service.go

-78
Original file line numberDiff line numberDiff line change
@@ -40,89 +40,11 @@ func (s *arduinoCoreServerImpl) Version(ctx context.Context, req *rpc.VersionReq
4040
return &rpc.VersionResponse{Version: s.versionString}, nil
4141
}
4242

43-
// Upload FIXMEDOC
44-
func (s *arduinoCoreServerImpl) Upload(req *rpc.UploadRequest, stream rpc.ArduinoCoreService_UploadServer) error {
45-
syncSend := NewSynchronizedSend(stream.Send)
46-
outStream := feedStreamTo(func(data []byte) {
47-
syncSend.Send(&rpc.UploadResponse{
48-
Message: &rpc.UploadResponse_OutStream{OutStream: data},
49-
})
50-
})
51-
errStream := feedStreamTo(func(data []byte) {
52-
syncSend.Send(&rpc.UploadResponse{
53-
Message: &rpc.UploadResponse_ErrStream{ErrStream: data},
54-
})
55-
})
56-
res, err := Upload(stream.Context(), req, outStream, errStream)
57-
outStream.Close()
58-
errStream.Close()
59-
if res != nil {
60-
syncSend.Send(&rpc.UploadResponse{
61-
Message: &rpc.UploadResponse_Result{
62-
Result: res,
63-
},
64-
})
65-
}
66-
return err
67-
}
68-
69-
// UploadUsingProgrammer FIXMEDOC
70-
func (s *arduinoCoreServerImpl) UploadUsingProgrammer(req *rpc.UploadUsingProgrammerRequest, stream rpc.ArduinoCoreService_UploadUsingProgrammerServer) error {
71-
syncSend := NewSynchronizedSend(stream.Send)
72-
outStream := feedStreamTo(func(data []byte) {
73-
syncSend.Send(&rpc.UploadUsingProgrammerResponse{
74-
Message: &rpc.UploadUsingProgrammerResponse_OutStream{
75-
OutStream: data,
76-
},
77-
})
78-
})
79-
errStream := feedStreamTo(func(data []byte) {
80-
syncSend.Send(&rpc.UploadUsingProgrammerResponse{
81-
Message: &rpc.UploadUsingProgrammerResponse_ErrStream{
82-
ErrStream: data,
83-
},
84-
})
85-
})
86-
err := UploadUsingProgrammer(stream.Context(), req, outStream, errStream)
87-
outStream.Close()
88-
errStream.Close()
89-
if err != nil {
90-
return err
91-
}
92-
return nil
93-
}
94-
9543
// SupportedUserFields FIXMEDOC
9644
func (s *arduinoCoreServerImpl) SupportedUserFields(ctx context.Context, req *rpc.SupportedUserFieldsRequest) (*rpc.SupportedUserFieldsResponse, error) {
9745
return SupportedUserFields(ctx, req)
9846
}
9947

100-
// BurnBootloader FIXMEDOC
101-
func (s *arduinoCoreServerImpl) BurnBootloader(req *rpc.BurnBootloaderRequest, stream rpc.ArduinoCoreService_BurnBootloaderServer) error {
102-
syncSend := NewSynchronizedSend(stream.Send)
103-
outStream := feedStreamTo(func(data []byte) {
104-
syncSend.Send(&rpc.BurnBootloaderResponse{
105-
Message: &rpc.BurnBootloaderResponse_OutStream{
106-
OutStream: data,
107-
},
108-
})
109-
})
110-
errStream := feedStreamTo(func(data []byte) {
111-
syncSend.Send(&rpc.BurnBootloaderResponse{
112-
Message: &rpc.BurnBootloaderResponse_ErrStream{
113-
ErrStream: data,
114-
},
115-
})
116-
})
117-
resp, err := BurnBootloader(stream.Context(), req, outStream, errStream)
118-
outStream.Close()
119-
errStream.Close()
120-
if err != nil {
121-
return err
122-
}
123-
return syncSend.Send(resp)
124-
}
125-
12648
// ListProgrammersAvailableForUpload FIXMEDOC
12749
func (s *arduinoCoreServerImpl) ListProgrammersAvailableForUpload(ctx context.Context, req *rpc.ListProgrammersAvailableForUploadRequest) (*rpc.ListProgrammersAvailableForUploadResponse, error) {
12850
return ListProgrammersAvailableForUpload(ctx, req)

Diff for: commands/service_upload.go

+74-13
Original file line numberDiff line numberDiff line change
@@ -120,21 +120,46 @@ func getUserFields(toolID string, platformRelease *cores.PlatformRelease) []*rpc
120120
return userFields
121121
}
122122

123-
// Upload FIXMEDOC
124-
func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, errStream io.Writer) (*rpc.UploadResult, error) {
123+
// UploadToServerStreams return a server stream that forwards the output and error streams to the provided writers.
124+
// It also returns a function that can be used to retrieve the result of the upload.
125+
func UploadToServerStreams(ctx context.Context, outStream io.Writer, errStream io.Writer) (rpc.ArduinoCoreService_UploadServer, func() *rpc.UploadResult) {
126+
var result *rpc.UploadResult
127+
stream := streamResponseToCallback(ctx, func(resp *rpc.UploadResponse) error {
128+
if errData := resp.GetErrStream(); len(errData) > 0 {
129+
_, err := errStream.Write(errData)
130+
return err
131+
}
132+
if outData := resp.GetOutStream(); len(outData) > 0 {
133+
_, err := outStream.Write(outData)
134+
return err
135+
}
136+
if res := resp.GetResult(); res != nil {
137+
result = res
138+
}
139+
return nil
140+
})
141+
return stream, func() *rpc.UploadResult {
142+
return result
143+
}
144+
}
145+
146+
// Upload performs the upload of a sketch to a board.
147+
func (s *arduinoCoreServerImpl) Upload(req *rpc.UploadRequest, stream rpc.ArduinoCoreService_UploadServer) error {
148+
syncSend := NewSynchronizedSend(stream.Send)
149+
125150
logrus.Tracef("Upload %s on %s started", req.GetSketchPath(), req.GetFqbn())
126151

127152
// TODO: make a generic function to extract sketch from request
128153
// and remove duplication in commands/compile.go
129154
sketchPath := paths.New(req.GetSketchPath())
130155
sk, err := sketch.New(sketchPath)
131156
if err != nil && req.GetImportDir() == "" && req.GetImportFile() == "" {
132-
return nil, &cmderrors.CantOpenSketchError{Cause: err}
157+
return &cmderrors.CantOpenSketchError{Cause: err}
133158
}
134159

135160
pme, pmeRelease, err := instances.GetPackageManagerExplorer(req.GetInstance())
136161
if err != nil {
137-
return nil, err
162+
return err
138163
}
139164
defer pmeRelease()
140165

@@ -151,6 +176,20 @@ func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, er
151176
programmer = sk.GetDefaultProgrammer()
152177
}
153178

179+
outStream := feedStreamTo(func(data []byte) {
180+
syncSend.Send(&rpc.UploadResponse{
181+
Message: &rpc.UploadResponse_OutStream{OutStream: data},
182+
})
183+
})
184+
defer outStream.Close()
185+
errStream := feedStreamTo(func(data []byte) {
186+
syncSend.Send(&rpc.UploadResponse{
187+
Message: &rpc.UploadResponse_ErrStream{ErrStream: data},
188+
})
189+
})
190+
defer errStream.Close()
191+
// TODO: inject context
192+
// ctx := stream.Context()
154193
updatedPort, err := runProgramAction(
155194
pme,
156195
sk,
@@ -168,22 +207,45 @@ func Upload(ctx context.Context, req *rpc.UploadRequest, outStream io.Writer, er
168207
req.GetUserFields(),
169208
)
170209
if err != nil {
171-
return nil, err
210+
return err
172211
}
173-
174-
return &rpc.UploadResult{
175-
UpdatedUploadPort: updatedPort,
176-
}, nil
212+
return syncSend.Send(&rpc.UploadResponse{
213+
Message: &rpc.UploadResponse_Result{
214+
Result: &rpc.UploadResult{
215+
UpdatedUploadPort: updatedPort,
216+
},
217+
},
218+
})
177219
}
178220

179221
// UploadUsingProgrammer FIXMEDOC
180-
func UploadUsingProgrammer(ctx context.Context, req *rpc.UploadUsingProgrammerRequest, outStream io.Writer, errStream io.Writer) error {
222+
func (s *arduinoCoreServerImpl) UploadUsingProgrammer(req *rpc.UploadUsingProgrammerRequest, stream rpc.ArduinoCoreService_UploadUsingProgrammerServer) error {
223+
syncSend := NewSynchronizedSend(stream.Send)
224+
streamAdapter := streamResponseToCallback(stream.Context(), func(resp *rpc.UploadResponse) error {
225+
if errData := resp.GetErrStream(); len(errData) > 0 {
226+
syncSend.Send(&rpc.UploadUsingProgrammerResponse{
227+
Message: &rpc.UploadUsingProgrammerResponse_ErrStream{
228+
ErrStream: errData,
229+
},
230+
})
231+
}
232+
if outData := resp.GetOutStream(); len(outData) > 0 {
233+
syncSend.Send(&rpc.UploadUsingProgrammerResponse{
234+
Message: &rpc.UploadUsingProgrammerResponse_OutStream{
235+
OutStream: outData,
236+
},
237+
})
238+
}
239+
// resp.GetResult() is ignored
240+
return nil
241+
})
242+
181243
logrus.Tracef("Upload using programmer %s on %s started", req.GetSketchPath(), req.GetFqbn())
182244

183245
if req.GetProgrammer() == "" {
184246
return &cmderrors.MissingProgrammerError{}
185247
}
186-
_, err := Upload(ctx, &rpc.UploadRequest{
248+
return s.Upload(&rpc.UploadRequest{
187249
Instance: req.GetInstance(),
188250
SketchPath: req.GetSketchPath(),
189251
ImportFile: req.GetImportFile(),
@@ -194,8 +256,7 @@ func UploadUsingProgrammer(ctx context.Context, req *rpc.UploadUsingProgrammerRe
194256
Verbose: req.GetVerbose(),
195257
Verify: req.GetVerify(),
196258
UserFields: req.GetUserFields(),
197-
}, outStream, errStream)
198-
return err
259+
}, streamAdapter)
199260
}
200261

201262
func runProgramAction(pme *packagemanager.Explorer,

Diff for: commands/service_upload_burnbootloader.go

+39-5
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,42 @@ import (
2424
"github.com/sirupsen/logrus"
2525
)
2626

27-
// BurnBootloader FIXMEDOC
28-
func BurnBootloader(ctx context.Context, req *rpc.BurnBootloaderRequest, outStream io.Writer, errStream io.Writer) (*rpc.BurnBootloaderResponse, error) {
27+
// BurnBootloaderToServerStreams return a server stream that forwards the output and error streams to the provided io.Writers
28+
func BurnBootloaderToServerStreams(ctx context.Context, outStrem, errStream io.Writer) rpc.ArduinoCoreService_BurnBootloaderServer {
29+
stream := streamResponseToCallback(ctx, func(resp *rpc.BurnBootloaderResponse) error {
30+
if outData := resp.GetOutStream(); len(outData) > 0 {
31+
_, err := outStrem.Write(outData)
32+
return err
33+
}
34+
if errData := resp.GetErrStream(); len(errData) > 0 {
35+
_, err := errStream.Write(errData)
36+
return err
37+
}
38+
return nil
39+
})
40+
return stream
41+
}
42+
43+
// BurnBootloader performs the burn bootloader action
44+
func (s *arduinoCoreServerImpl) BurnBootloader(req *rpc.BurnBootloaderRequest, stream rpc.ArduinoCoreService_BurnBootloaderServer) error {
45+
syncSend := NewSynchronizedSend(stream.Send)
46+
outStream := feedStreamTo(func(data []byte) {
47+
syncSend.Send(&rpc.BurnBootloaderResponse{
48+
Message: &rpc.BurnBootloaderResponse_OutStream{
49+
OutStream: data,
50+
},
51+
})
52+
})
53+
defer outStream.Close()
54+
errStream := feedStreamTo(func(data []byte) {
55+
syncSend.Send(&rpc.BurnBootloaderResponse{
56+
Message: &rpc.BurnBootloaderResponse_ErrStream{
57+
ErrStream: data,
58+
},
59+
})
60+
})
61+
defer errStream.Close()
62+
2963
logrus.
3064
WithField("fqbn", req.GetFqbn()).
3165
WithField("port", req.GetPort()).
@@ -34,7 +68,7 @@ func BurnBootloader(ctx context.Context, req *rpc.BurnBootloaderRequest, outStre
3468

3569
pme, release, err := instances.GetPackageManagerExplorer(req.GetInstance())
3670
if err != nil {
37-
return nil, err
71+
return err
3872
}
3973
defer release()
4074

@@ -54,7 +88,7 @@ func BurnBootloader(ctx context.Context, req *rpc.BurnBootloaderRequest, outStre
5488
req.GetDryRun(),
5589
map[string]string{}, // User fields
5690
); err != nil {
57-
return nil, err
91+
return err
5892
}
59-
return &rpc.BurnBootloaderResponse{}, nil
93+
return syncSend.Send(&rpc.BurnBootloaderResponse{})
6094
}

Diff for: internal/cli/burnbootloader/burnbootloader.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -78,15 +78,16 @@ func runBootloaderCommand(srv rpc.ArduinoCoreServiceServer) {
7878
}
7979

8080
stdOut, stdErr, res := feedback.OutputStreams()
81-
if _, err := commands.BurnBootloader(context.Background(), &rpc.BurnBootloaderRequest{
81+
stream := commands.BurnBootloaderToServerStreams(ctx, stdOut, stdErr)
82+
if err := srv.BurnBootloader(&rpc.BurnBootloaderRequest{
8283
Instance: instance,
8384
Fqbn: fqbn.String(),
8485
Port: discoveryPort,
8586
Verbose: verbose,
8687
Verify: verify,
8788
Programmer: programmer.String(instance, srv, fqbn.String()),
8889
DryRun: dryRun,
89-
}, stdOut, stdErr); err != nil {
90+
}, stream); err != nil {
9091
errcode := feedback.ErrGeneric
9192
if errors.Is(err, &cmderrors.ProgrammerRequiredForUploadError{}) {
9293
errcode = feedback.ErrMissingProgrammer

Diff for: internal/cli/compile/compile.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,8 @@ func runCompileCommand(cmd *cobra.Command, args []string, srv rpc.ArduinoCoreSer
294294
UserFields: fields,
295295
}
296296

297-
if res, err := commands.Upload(context.Background(), uploadRequest, stdOut, stdErr); err != nil {
297+
stream, streamRes := commands.UploadToServerStreams(ctx, stdOut, stdErr)
298+
if err := srv.Upload(uploadRequest, stream); err != nil {
298299
errcode := feedback.ErrGeneric
299300
if errors.Is(err, &cmderrors.ProgrammerRequiredForUploadError{}) {
300301
errcode = feedback.ErrMissingProgrammer
@@ -304,7 +305,7 @@ func runCompileCommand(cmd *cobra.Command, args []string, srv rpc.ArduinoCoreSer
304305
}
305306
feedback.Fatal(tr("Error during Upload: %v", err), errcode)
306307
} else {
307-
uploadRes = res
308+
uploadRes = streamRes()
308309
}
309310
}
310311

Diff for: internal/cli/upload/upload.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ func runUploadCommand(srv rpc.ArduinoCoreServiceServer, args []string, uploadFie
199199
DryRun: dryRun,
200200
UserFields: fields,
201201
}
202-
if res, err := commands.Upload(context.Background(), req, stdOut, stdErr); err != nil {
202+
stream, streamResp := commands.UploadToServerStreams(ctx, stdOut, stdErr)
203+
if err := srv.Upload(req, stream); err != nil {
203204
errcode := feedback.ErrGeneric
204205
if errors.Is(err, &cmderrors.ProgrammerRequiredForUploadError{}) {
205206
errcode = feedback.ErrMissingProgrammer
@@ -213,7 +214,7 @@ func runUploadCommand(srv rpc.ArduinoCoreServiceServer, args []string, uploadFie
213214
feedback.PrintResult(&uploadResult{
214215
Stdout: io.Stdout,
215216
Stderr: io.Stderr,
216-
UpdatedUploadPort: result.NewPort(res.GetUpdatedUploadPort()),
217+
UpdatedUploadPort: result.NewPort(streamResp().GetUpdatedUploadPort()),
217218
})
218219
}
219220
}

0 commit comments

Comments
 (0)