Skip to content

Commit 64df40f

Browse files
t0yv0VenelinMartinov
authored andcommitted
Allow walking types
1 parent dcf5648 commit 64df40f

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
@@ -155,6 +155,25 @@ func (t ctyTypeShim) IsObjectType() bool {
155155
return t.ty().IsObjectType()
156156
}
157157

158+
func (t ctyTypeShim) AttributeType(name string) (Type, bool) {
159+
tt := t.ty()
160+
if !tt.IsObjectType() {
161+
return nil, false
162+
}
163+
if !tt.HasAttribute(name) {
164+
return nil, false
165+
}
166+
return FromHCtyType(tt.AttributeType(name)), true
167+
}
168+
169+
func (t ctyTypeShim) ElementType() (Type, bool) {
170+
tt := t.ty()
171+
if !tt.IsCollectionType() {
172+
return nil, false
173+
}
174+
return FromHCtyType(tt.ElementType()), true
175+
}
176+
158177
func (t ctyTypeShim) GoString() string {
159178
return t.ty().GoString()
160179
}

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
@@ -57,5 +57,7 @@ type Type interface {
5757
IsMapType() bool
5858
IsSetType() bool
5959
IsObjectType() bool
60+
AttributeType(name string) (Type, bool)
61+
ElementType() (Type, bool)
6062
GoString() string
6163
}

pkg/valueshim/tfvalue.go

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

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)