Skip to content

Commit 88e05ae

Browse files
committed
Merge branch 'main' into generalized-monitoring-extraction
2 parents c9a3f9b + 11e6c92 commit 88e05ae

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

pkg/codec/element_extractor.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"encoding/json"
55
"fmt"
66
"reflect"
7+
"slices"
78
"strings"
89

910
"github.com/smartcontractkit/chainlink-common/pkg/types"
@@ -134,6 +135,12 @@ func expandMap(extractMap map[string]any, key string, _ *ElementExtractorLocatio
134135
}
135136

136137
rItem := reflect.ValueOf(item)
138+
// Must be one of these Kinds to check IsNil, this check is not same as item == nil check.
139+
if slices.Contains([]reflect.Kind{reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Pointer, reflect.Slice}, rItem.Kind()) && rItem.IsNil() {
140+
extractMap[key] = reflect.MakeSlice(reflect.SliceOf(rItem.Type()), 0, 0).Interface()
141+
return nil
142+
}
143+
137144
slice := reflect.MakeSlice(reflect.SliceOf(rItem.Type()), 1, 1)
138145
slice.Index(0).Set(rItem)
139146
extractMap[key] = slice.Interface()

pkg/codec/element_extractor_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@ func TestElementExtractor(t *testing.T) {
2626
D uint64
2727
}
2828

29+
type nilFields struct {
30+
A *int64
31+
B string
32+
C *testStruct
33+
D []testStruct
34+
}
35+
2936
type nestedTestStruct struct {
3037
A string
3138
B testStruct
@@ -131,6 +138,27 @@ func TestElementExtractor(t *testing.T) {
131138
assert.Equal(t, iInput.Interface(), newInput)
132139
})
133140

141+
t.Run("TransformToOnChain and TransformToOffChain works on nil ptr by initialising empty values", func(t *testing.T) {
142+
inputType, err := extractor.RetypeToOffChain(reflect.TypeOf(nilFields{}), "")
143+
require.NoError(t, err)
144+
145+
iInput := reflect.Indirect(reflect.New(inputType))
146+
output, err := extractor.TransformToOnChain(iInput.Interface(), "")
147+
require.NoError(t, err)
148+
149+
expected := nilFields{}
150+
assert.Equal(t, expected, output)
151+
152+
newInput, err := extractor.TransformToOffChain(expected, "")
153+
require.NoError(t, err)
154+
155+
// Lossy modification
156+
iInput.FieldByName("A").Set(reflect.ValueOf([]*int64{}))
157+
iInput.FieldByName("C").Set(reflect.ValueOf([]*testStruct{}))
158+
iInput.FieldByName("D").Set(reflect.ValueOf([][]testStruct{}))
159+
assert.Equal(t, iInput.Interface(), newInput)
160+
})
161+
134162
t.Run("TransformToOnChain and TransformToOffChain returns error if input type was not from TransformToOnChain", func(t *testing.T) {
135163
_, err := invalidExtractor.TransformToOnChain(testStruct{}, "")
136164
assert.True(t, errors.Is(err, types.ErrInvalidType))

pkg/utils/retry/retry.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import (
1212
)
1313

1414
// CtxKeyTracingID is the context key for tracing ID
15-
const CtxKeyTracingID = "tracingID"
15+
type ctxKey string
16+
17+
const CtxKeyTracingID string = "tracingID"
1618

1719
// Exponential backoff (default) is used to handle retries with increasing wait times in case of errors
1820
var BackoffStrategyDefault = backoff.Backoff{

0 commit comments

Comments
 (0)