Skip to content

Commit 700a2bc

Browse files
cty: UnknownAsNull accepts marked values and preserves marks
This change was sponsored by Spacelift on behalf of the OpenTofu project.
1 parent 3c2b6a0 commit 700a2bc

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# 1.16.4 (Unreleased)
22

3+
* `cty.UnknownAsNull` now accepts marked values and preserves the given marks in its result. Previously it had no direct support for marks and so would either panic or return incorrect results when given marked values.
34

45
# 1.16.3 (May 16, 2025)
56

cty/unknown_as_null.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ package cty
88
// represent unknowns, such as JSON, as long as the caller does not need to
99
// retain the unknown value information.
1010
func UnknownAsNull(val Value) Value {
11+
if val.IsMarked() {
12+
val, valMarks := val.Unmark()
13+
return UnknownAsNull(val).WithMarks(valMarks)
14+
}
15+
1116
ty := val.Type()
1217
switch {
1318
case val.IsNull():

cty/unknown_as_null_test.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,100 @@ func TestUnknownAsNull(t *testing.T) {
179179
"greeting": NullVal(String),
180180
}),
181181
},
182+
183+
// Marks should be accepted and preserved verbatim
184+
{
185+
StringVal("hello").Mark("..."),
186+
StringVal("hello").Mark("..."),
187+
},
188+
{
189+
UnknownVal(String).Mark("..."),
190+
NullVal(String).Mark("..."),
191+
},
192+
{
193+
DynamicVal.Mark("..."),
194+
NullVal(DynamicPseudoType).Mark("..."),
195+
},
196+
{
197+
ListVal([]Value{
198+
UnknownVal(String),
199+
}).Mark("..."),
200+
ListVal([]Value{
201+
NullVal(String),
202+
}).Mark("..."),
203+
},
204+
{
205+
ListVal([]Value{
206+
UnknownVal(String).Mark("..."),
207+
}),
208+
ListVal([]Value{
209+
NullVal(String).Mark("..."),
210+
}),
211+
},
212+
{
213+
SetVal([]Value{
214+
UnknownVal(String),
215+
}).Mark("..."),
216+
SetVal([]Value{
217+
NullVal(String),
218+
}).Mark("..."),
219+
},
220+
{
221+
SetVal([]Value{
222+
UnknownVal(String).Mark("..."),
223+
}),
224+
SetVal([]Value{
225+
NullVal(String).Mark("..."),
226+
}),
227+
},
228+
{
229+
TupleVal([]Value{
230+
UnknownVal(String),
231+
}).Mark("..."),
232+
TupleVal([]Value{
233+
NullVal(String),
234+
}).Mark("..."),
235+
},
236+
{
237+
TupleVal([]Value{
238+
UnknownVal(String).Mark("..."),
239+
}),
240+
TupleVal([]Value{
241+
NullVal(String).Mark("..."),
242+
}),
243+
},
244+
{
245+
MapVal(map[string]Value{
246+
"greeting": UnknownVal(String),
247+
}).Mark("..."),
248+
MapVal(map[string]Value{
249+
"greeting": NullVal(String),
250+
}).Mark("..."),
251+
},
252+
{
253+
MapVal(map[string]Value{
254+
"greeting": UnknownVal(String).Mark("..."),
255+
}),
256+
MapVal(map[string]Value{
257+
"greeting": NullVal(String).Mark("..."),
258+
}),
259+
},
260+
{
261+
ObjectVal(map[string]Value{
262+
"greeting": UnknownVal(String),
263+
}).Mark("..."),
264+
ObjectVal(map[string]Value{
265+
"greeting": NullVal(String),
266+
}).Mark("..."),
267+
},
268+
{
269+
ObjectVal(map[string]Value{
270+
"greeting": UnknownVal(String).Mark("..."),
271+
}),
272+
ObjectVal(map[string]Value{
273+
"greeting": NullVal(String).Mark("..."),
274+
}),
275+
},
182276
}
183277

184278
for _, test := range tests {

0 commit comments

Comments
 (0)