Skip to content

Commit 01faa43

Browse files
SonarCloud: lower complexity of upd/client.writeMessage
1 parent ec789f2 commit 01faa43

File tree

3 files changed

+71
-10
lines changed

3 files changed

+71
-10
lines changed

pkg/fn/funcList.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package fn
2+
3+
type FuncList []func()
4+
5+
// Return a function that executions all added functions
6+
//
7+
// Functions are executed in reverse order they were added.
8+
func (c FuncList) ToFunction() func() {
9+
return func() {
10+
for i := range c {
11+
c[len(c)-1-i]()
12+
}
13+
}
14+
}
15+
16+
// Execute all added functions
17+
func (c FuncList) Execute() {
18+
c.ToFunction()()
19+
}

pkg/fn/funcList_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package fn_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/plgd-dev/go-coap/v3/pkg/fn"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
func TestFuncList(t *testing.T) {
11+
fns := make(fn.FuncList, 0, 2)
12+
13+
counter := 0
14+
// functions should execute in reverse order they were added in
15+
second := 0
16+
fns = append(fns, func() {
17+
second = counter
18+
counter++
19+
})
20+
first := 0
21+
fns = append(fns, func() {
22+
first = counter
23+
counter++
24+
})
25+
26+
fns.Execute()
27+
require.Equal(t, 0, first)
28+
require.Equal(t, 1, second)
29+
}

udp/client/conn.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"github.com/plgd-dev/go-coap/v3/options/config"
2121
"github.com/plgd-dev/go-coap/v3/pkg/cache"
2222
coapErrors "github.com/plgd-dev/go-coap/v3/pkg/errors"
23+
"github.com/plgd-dev/go-coap/v3/pkg/fn"
2324
coapSync "github.com/plgd-dev/go-coap/v3/pkg/sync"
2425
"github.com/plgd-dev/go-coap/v3/udp/coder"
2526
"go.uber.org/atomic"
@@ -288,21 +289,19 @@ func (cc *Conn) transmitMessage(req *pool.Message, waitForResponseChan chan stru
288289
return fmt.Errorf("timeout: retransmission(%v) was exhausted", cc.transmission.maxRetransmit.Load())
289290
}
290291

291-
func (cc *Conn) writeMessage(req *pool.Message) error {
292-
respChan := make(chan struct{})
293-
req.UpsertType(message.Confirmable)
294-
req.UpsertMessageID(cc.GetMessageID())
292+
func (cc *Conn) prepareWriteMessage(req *pool.Message, respChan chan struct{}) (func(), error) {
293+
var closeFns fn.FuncList
295294

296295
// Only confirmable messages ever match an message ID
297296
switch req.Type() {
298297
case message.Confirmable:
299298
if req.Code() >= codes.GET && req.Code() <= codes.DELETE {
300299
if err := cc.acquireOutstandingInteraction(req.Context()); err != nil {
301-
return err
300+
return nil, err
302301
}
303-
defer func() {
302+
closeFns = append(closeFns, func() {
304303
cc.releaseOutstandingInteraction()
305-
}()
304+
})
306305
}
307306
if _, loaded := cc.midHandlerContainer.LoadOrStore(req.MessageID(), func(w *responsewriter.ResponseWriter[*Conn], r *pool.Message) {
308307
close(respChan)
@@ -312,17 +311,31 @@ func (cc *Conn) writeMessage(req *pool.Message) error {
312311
}
313312
cc.handleBW(w, r)
314313
}); loaded {
315-
return fmt.Errorf("cannot insert mid(%v) handler: %w", req.MessageID(), coapErrors.ErrKeyAlreadyExists)
314+
closeFns.Execute()
315+
return nil, fmt.Errorf("cannot insert mid(%v) handler: %w", req.MessageID(), coapErrors.ErrKeyAlreadyExists)
316316
}
317-
defer func() {
317+
closeFns = append(closeFns, func() {
318318
_, _ = cc.midHandlerContainer.LoadAndDelete(req.MessageID())
319-
}()
319+
})
320320
case message.NonConfirmable:
321321
/* TODO need to acquireOutstandingInteraction
322322
if req.Code() >= codes.GET && req.Code() <= codes.DELETE {
323323
}
324324
*/
325325
}
326+
return closeFns.ToFunction(), nil
327+
}
328+
329+
func (cc *Conn) writeMessage(req *pool.Message) error {
330+
respChan := make(chan struct{})
331+
req.UpsertType(message.Confirmable)
332+
req.UpsertMessageID(cc.GetMessageID())
333+
334+
closeFn, err := cc.prepareWriteMessage(req, respChan)
335+
if err != nil {
336+
return err
337+
}
338+
defer closeFn()
326339

327340
if err := cc.session.WriteMessage(req); err != nil {
328341
return fmt.Errorf(errFmtWriteRequest, err)

0 commit comments

Comments
 (0)