Skip to content

Commit 0ead7d4

Browse files
committed
Allow walking types
1 parent 704d084 commit 0ead7d4

File tree

5 files changed

+102
-0
lines changed

5 files changed

+102
-0
lines changed

pkg/valueshim/cty.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,25 @@ func (t ctyTypeShim) IsObjectType() bool {
149149
return t.ty().IsObjectType()
150150
}
151151

152+
func (t ctyTypeShim) AttributeType(name string) (Type, bool) {
153+
tt := t.ty()
154+
if !tt.IsObjectType() {
155+
return nil, false
156+
}
157+
if !tt.HasAttribute(name) {
158+
return nil, false
159+
}
160+
return FromHCtyType(tt.AttributeType(name)), true
161+
}
162+
163+
func (t ctyTypeShim) ElementType() (Type, bool) {
164+
tt := t.ty()
165+
if !tt.IsCollectionType() {
166+
return nil, false
167+
}
168+
return FromHCtyType(tt.ElementType()), true
169+
}
170+
152171
func (t ctyTypeShim) GoString() string {
153172
return t.ty().GoString()
154173
}

pkg/valueshim/cty_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,3 +314,31 @@ func Test_HCty_ToX(t *testing.T) {
314314
assert.Equal(t, 42.41, valueshim.FromHCtyValue(cty.NumberFloatVal(42.41)).NumberValue())
315315
assert.Equal(t, true, valueshim.FromHCtyValue(cty.BoolVal(true)).BoolValue())
316316
}
317+
318+
func Test_HCtyType_AttributeType(t *testing.T) {
319+
objTy := cty.Object(map[string]cty.Type{"x": cty.String})
320+
321+
ty, ok := valueshim.FromHCtyType(objTy).AttributeType("x")
322+
assert.True(t, ok)
323+
assert.Equal(t, valueshim.FromHCtyType(cty.String), ty)
324+
325+
_, ok = valueshim.FromHCtyType(objTy).AttributeType("y")
326+
assert.False(t, ok)
327+
}
328+
329+
func Test_HCtyType_ElementType(t *testing.T) {
330+
ty, ok := valueshim.FromHCtyType(cty.Set(cty.Number)).ElementType()
331+
assert.True(t, ok)
332+
assert.Equal(t, valueshim.FromHCtyType(cty.Number), ty)
333+
334+
ty, ok = valueshim.FromHCtyType(cty.List(cty.Number)).ElementType()
335+
assert.True(t, ok)
336+
assert.Equal(t, valueshim.FromHCtyType(cty.Number), ty)
337+
338+
ty, ok = valueshim.FromHCtyType(cty.Map(cty.Number)).ElementType()
339+
assert.True(t, ok)
340+
assert.Equal(t, valueshim.FromHCtyType(cty.Number), ty)
341+
342+
ty, ok = valueshim.FromHCtyType(cty.String).ElementType()
343+
assert.False(t, ok)
344+
}

pkg/valueshim/shim.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,7 @@ type Type interface {
5555
IsMapType() bool
5656
IsSetType() bool
5757
IsObjectType() bool
58+
AttributeType(name string) (Type, bool)
59+
ElementType() (Type, bool)
5860
GoString() string
5961
}

pkg/valueshim/tfvalue.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,28 @@ func (t tTypeShim) IsObjectType() bool {
190190
func (t tTypeShim) GoString() string {
191191
return t.ty().String()
192192
}
193+
194+
func (t tTypeShim) AttributeType(name string) (Type, bool) {
195+
if !t.IsObjectType() {
196+
return nil, false
197+
}
198+
tt := t.ty()
199+
attr, ok := tt.(tftypes.Object).AttributeTypes[name]
200+
if !ok {
201+
return nil, false
202+
}
203+
return FromTType(attr), true
204+
}
205+
206+
func (t tTypeShim) ElementType() (Type, bool) {
207+
tt := t.ty()
208+
switch {
209+
case tt.Is(tftypes.Map{}):
210+
return FromTType(tt.(tftypes.Map).ElementType), true
211+
case tt.Is(tftypes.List{}):
212+
return FromTType(tt.(tftypes.List).ElementType), true
213+
case tt.Is(tftypes.Set{}):
214+
return FromTType(tt.(tftypes.Set).ElementType), true
215+
}
216+
return nil, false
217+
}

pkg/valueshim/tfvalue_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,34 @@ func Test_TType(t *testing.T) {
313313
assert.Equal(t, "tftypes.Object[]", valueshim.FromTType(tftypes.Object{}).GoString())
314314
}
315315

316+
func Test_TType_AttributeType(t *testing.T) {
317+
objTy := tftypes.Object{AttributeTypes: map[string]tftypes.Type{"x": tftypes.String}}
318+
319+
ty, ok := valueshim.FromTType(objTy).AttributeType("x")
320+
assert.True(t, ok)
321+
assert.Equal(t, valueshim.FromTType(tftypes.String), ty)
322+
323+
_, ok = valueshim.FromTType(objTy).AttributeType("y")
324+
assert.False(t, ok)
325+
}
326+
327+
func Test_TType_ElementType(t *testing.T) {
328+
ty, ok := valueshim.FromTType(tftypes.Set{ElementType: tftypes.Number}).ElementType()
329+
assert.True(t, ok)
330+
assert.Equal(t, valueshim.FromTType(tftypes.Number), ty)
331+
332+
ty, ok = valueshim.FromTType(tftypes.List{ElementType: tftypes.Number}).ElementType()
333+
assert.True(t, ok)
334+
assert.Equal(t, valueshim.FromTType(tftypes.Number), ty)
335+
336+
ty, ok = valueshim.FromTType(tftypes.Map{ElementType: tftypes.Number}).ElementType()
337+
assert.True(t, ok)
338+
assert.Equal(t, valueshim.FromTType(tftypes.Number), ty)
339+
340+
ty, ok = valueshim.FromTType(tftypes.String).ElementType()
341+
assert.False(t, ok)
342+
}
343+
316344
func Test_TValue_ToX(t *testing.T) {
317345
t.Parallel()
318346

0 commit comments

Comments
 (0)