Skip to content

Commit 9beb8a6

Browse files
committed
Introduce ctxutil.GetMapKeyName()
1 parent 00b1290 commit 9beb8a6

File tree

3 files changed

+78
-25
lines changed

3 files changed

+78
-25
lines changed

pkg/ottl/contexts/internal/ctxprofile/profile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ func accessAttributesKey[K Context](key []ottl.Key[K]) ottl.StandardGetSetter[K]
454454
return ctxutil.GetMapValue[K](ctx, tCtx, pprofile.FromAttributeIndices(tCtx.GetProfile().AttributeTable(), tCtx.GetProfile()), key)
455455
},
456456
Setter: func(ctx context.Context, tCtx K, val any) error {
457-
newKey, err := key[0].String(ctx, tCtx)
457+
newKey, err := ctxutil.GetMapKeyName(ctx, tCtx, key)
458458
if err != nil {
459459
return err
460460
}

pkg/ottl/contexts/internal/ctxutil/map.go

Lines changed: 20 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,10 @@ import (
1414
)
1515

1616
func GetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.Key[K]) (any, error) {
17-
if len(keys) == 0 {
18-
return nil, errors.New("cannot get map value without keys")
19-
}
20-
21-
s, err := keys[0].String(ctx, tCtx)
17+
s, err := GetMapKeyName(ctx, tCtx, keys)
2218
if err != nil {
2319
return nil, err
2420
}
25-
if s == nil {
26-
resString, err := FetchValueFromExpression[K, string](ctx, tCtx, keys[0])
27-
if err != nil {
28-
return nil, fmt.Errorf("unable to resolve a string index in map: %w", err)
29-
}
30-
s = resString
31-
}
3221

3322
val, ok := m.Get(*s)
3423
if !ok {
@@ -39,21 +28,10 @@ func GetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.
3928
}
4029

4130
func SetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.Key[K], val any) error {
42-
if len(keys) == 0 {
43-
return errors.New("cannot set map value without key")
44-
}
45-
46-
s, err := keys[0].String(ctx, tCtx)
31+
s, err := GetMapKeyName(ctx, tCtx, keys)
4732
if err != nil {
4833
return err
4934
}
50-
if s == nil {
51-
resString, err := FetchValueFromExpression[K, string](ctx, tCtx, keys[0])
52-
if err != nil {
53-
return fmt.Errorf("unable to resolve a string index in map: %w", err)
54-
}
55-
s = resString
56-
}
5735

5836
currentValue, ok := m.Get(*s)
5937
if !ok {
@@ -62,6 +40,24 @@ func SetMapValue[K any](ctx context.Context, tCtx K, m pcommon.Map, keys []ottl.
6240
return SetIndexableValue[K](ctx, tCtx, currentValue, val, keys[1:])
6341
}
6442

43+
func GetMapKeyName[K any](ctx context.Context, tCtx K, keys []ottl.Key[K]) (*string, error) {
44+
if len(keys) == 0 {
45+
return nil, errors.New("empty keys")
46+
}
47+
48+
resolvedKey, err := keys[0].String(ctx, tCtx)
49+
if err != nil {
50+
return nil, err
51+
}
52+
if resolvedKey == nil {
53+
resolvedKey, err = FetchValueFromExpression[K, string](ctx, tCtx, keys[0])
54+
if err != nil {
55+
return nil, fmt.Errorf("unable to resolve a string index in map: %w", err)
56+
}
57+
}
58+
return resolvedKey, nil
59+
}
60+
6561
func FetchValueFromExpression[K any, T int64 | string](ctx context.Context, tCtx K, key ottl.Key[K]) (*T, error) {
6662
p, err := key.ExpressionGetter(ctx, tCtx)
6763
if err != nil {

pkg/ottl/contexts/internal/ctxutil/map_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,3 +389,60 @@ func Test_GetMap(t *testing.T) {
389389
})
390390
}
391391
}
392+
393+
func Test_GetMapKeyName(t *testing.T) {
394+
getSetter := &ottl.StandardGetSetter[any]{
395+
Getter: func(_ context.Context, _ any) (any, error) {
396+
return nil, nil
397+
},
398+
}
399+
tests := []struct {
400+
name string
401+
keys []ottl.Key[any]
402+
err error
403+
key string
404+
}{
405+
{
406+
name: "empty keys",
407+
keys: []ottl.Key[any]{},
408+
err: errors.New("empty keys"),
409+
},
410+
{
411+
name: "first key not a string",
412+
keys: []ottl.Key[any]{
413+
&pathtest.Key[any]{
414+
I: ottltest.Intp(0),
415+
G: getSetter,
416+
},
417+
},
418+
err: errors.New("unable to resolve a string index in map: could not resolve key for map/slice, expecting 'string' but got '<nil>'"),
419+
},
420+
{
421+
name: "first key not initialized",
422+
keys: []ottl.Key[any]{
423+
&pathtest.Key[any]{},
424+
},
425+
err: errors.New("unable to resolve a string index in map: invalid key type"),
426+
},
427+
{
428+
name: "valid",
429+
keys: []ottl.Key[any]{
430+
&pathtest.Key[any]{
431+
S: ottltest.Strp("string"),
432+
},
433+
},
434+
key: "string",
435+
},
436+
}
437+
438+
for _, tt := range tests {
439+
t.Run(tt.name, func(t *testing.T) {
440+
resolvedKey, err := ctxutil.GetMapKeyName[any](context.Background(), nil, tt.keys)
441+
if tt.err != nil {
442+
assert.Equal(t, tt.err.Error(), err.Error())
443+
return
444+
}
445+
assert.Equal(t, tt.key, *resolvedKey)
446+
})
447+
}
448+
}

0 commit comments

Comments
 (0)