Skip to content

Commit

Permalink
fixup! function/stdlib: LookupFunc precise handling of marks
Browse files Browse the repository at this point in the history
  • Loading branch information
alisdair committed Apr 20, 2021
1 parent 2329ef7 commit b535a2a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 9 deletions.
20 changes: 13 additions & 7 deletions cty/function/stdlib/collection.go
Expand Up @@ -683,30 +683,36 @@ var LookupFunc = function.New(&function.Spec{
// leave default value marked
defaultVal := args[2]

var markses []cty.ValueMarks

// unmark collection, retain marks to reapply later
mapVar, marks := args[0].Unmark()
mapVar, mapMarks := args[0].Unmark()
markses = append(markses, mapMarks)

// disregard marks on the key
keyVal, _ := args[1].Unmark()
// include marks on the key in the result
keyVal, keyMarks := args[1].Unmark()
if len(keyMarks) > 0 {
markses = append(markses, keyMarks)
}
lookupKey := keyVal.AsString()

if !mapVar.IsWhollyKnown() {
return cty.UnknownVal(retType).WithMarks(marks), nil
return cty.UnknownVal(retType).WithMarks(markses...), nil
}

if mapVar.Type().IsObjectType() {
if mapVar.Type().HasAttribute(lookupKey) {
return mapVar.GetAttr(lookupKey).WithMarks(marks), nil
return mapVar.GetAttr(lookupKey).WithMarks(markses...), nil
}
} else if mapVar.HasIndex(cty.StringVal(lookupKey)) == cty.True {
return mapVar.Index(cty.StringVal(lookupKey)).WithMarks(marks), nil
return mapVar.Index(cty.StringVal(lookupKey)).WithMarks(markses...), nil
}

defaultVal, err = convert.Convert(defaultVal, retType)
if err != nil {
return cty.NilVal, err
}
return defaultVal.WithMarks(marks), nil
return defaultVal.WithMarks(markses...), nil
},
})

Expand Down
4 changes: 2 additions & 2 deletions cty/function/stdlib/collection_test.go
Expand Up @@ -1080,14 +1080,14 @@ func TestLookup(t *testing.T) {
cty.NumberIntVal(5).Mark("c"),
cty.StringVal("5").Mark("c"),
},
{ // disregard marks on key
{ // propagate marks from key
cty.MapVal(map[string]cty.Value{
"boop": cty.StringVal("beep"),
"frob": cty.StringVal("honk"),
}),
cty.StringVal("boop").Mark("a"),
cty.StringVal("nope"),
cty.StringVal("beep"),
cty.StringVal("beep").Mark("a"),
},
}

Expand Down

0 comments on commit b535a2a

Please sign in to comment.