Merge pull request #437 from hashicorp/alisdair/template-join-expr-marked
hclsyntax: Fix panic for marked template loops
This commit is contained in:
commit
088f7afb7d
@ -152,6 +152,8 @@ func (e *TemplateJoinExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnosti
|
|||||||
return cty.UnknownVal(cty.String), diags
|
return cty.UnknownVal(cty.String), diags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tuple, marks := tuple.Unmark()
|
||||||
|
allMarks := []cty.ValueMarks{marks}
|
||||||
buf := &bytes.Buffer{}
|
buf := &bytes.Buffer{}
|
||||||
it := tuple.ElementIterator()
|
it := tuple.ElementIterator()
|
||||||
for it.Next() {
|
for it.Next() {
|
||||||
@ -171,7 +173,7 @@ func (e *TemplateJoinExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnosti
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if val.Type() == cty.DynamicPseudoType {
|
if val.Type() == cty.DynamicPseudoType {
|
||||||
return cty.UnknownVal(cty.String), diags
|
return cty.UnknownVal(cty.String).WithMarks(marks), diags
|
||||||
}
|
}
|
||||||
strVal, err := convert.Convert(val, cty.String)
|
strVal, err := convert.Convert(val, cty.String)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -189,13 +191,17 @@ func (e *TemplateJoinExpr) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnosti
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !val.IsKnown() {
|
if !val.IsKnown() {
|
||||||
return cty.UnknownVal(cty.String), diags
|
return cty.UnknownVal(cty.String).WithMarks(marks), diags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
strVal, strValMarks := strVal.Unmark()
|
||||||
|
if len(strValMarks) > 0 {
|
||||||
|
allMarks = append(allMarks, strValMarks)
|
||||||
|
}
|
||||||
buf.WriteString(strVal.AsString())
|
buf.WriteString(strVal.AsString())
|
||||||
}
|
}
|
||||||
|
|
||||||
return cty.StringVal(buf.String()), diags
|
return cty.StringVal(buf.String()).WithMarks(allMarks...), diags
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *TemplateJoinExpr) Range() hcl.Range {
|
func (e *TemplateJoinExpr) Range() hcl.Range {
|
||||||
|
@ -316,6 +316,48 @@ trim`,
|
|||||||
cty.StringVal(`Authenticate with "my voice is my passport"`).WithMarks(cty.NewValueMarks("sensitive")),
|
cty.StringVal(`Authenticate with "my voice is my passport"`).WithMarks(cty.NewValueMarks("sensitive")),
|
||||||
0,
|
0,
|
||||||
},
|
},
|
||||||
|
{ // can loop over marked collections
|
||||||
|
`%{ for s in secrets }${s}%{ endfor }`,
|
||||||
|
&hcl.EvalContext{
|
||||||
|
Variables: map[string]cty.Value{
|
||||||
|
"secrets": cty.ListVal([]cty.Value{
|
||||||
|
cty.StringVal("foo"),
|
||||||
|
cty.StringVal("bar"),
|
||||||
|
cty.StringVal("baz"),
|
||||||
|
}).Mark("sensitive"),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cty.StringVal("foobarbaz").Mark("sensitive"),
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{ // marks on individual elements propagate to the result
|
||||||
|
`%{ for s in secrets }${s}%{ endfor }`,
|
||||||
|
&hcl.EvalContext{
|
||||||
|
Variables: map[string]cty.Value{
|
||||||
|
"secrets": cty.ListVal([]cty.Value{
|
||||||
|
cty.StringVal("foo"),
|
||||||
|
cty.StringVal("bar").Mark("sensitive"),
|
||||||
|
cty.StringVal("baz"),
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cty.StringVal("foobarbaz").Mark("sensitive"),
|
||||||
|
0,
|
||||||
|
},
|
||||||
|
{ // lots of marks!
|
||||||
|
`%{ for s in secrets }${s}%{ endfor }`,
|
||||||
|
&hcl.EvalContext{
|
||||||
|
Variables: map[string]cty.Value{
|
||||||
|
"secrets": cty.ListVal([]cty.Value{
|
||||||
|
cty.StringVal("foo").Mark("x"),
|
||||||
|
cty.StringVal("bar").Mark("y"),
|
||||||
|
cty.StringVal("baz").Mark("z"),
|
||||||
|
}).Mark("x"), // second instance of x
|
||||||
|
},
|
||||||
|
},
|
||||||
|
cty.StringVal("foobarbaz").WithMarks(cty.NewValueMarks("x", "y", "z")),
|
||||||
|
0,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, test := range tests {
|
for _, test := range tests {
|
||||||
|
Loading…
Reference in New Issue
Block a user