diff --git a/cty/convert/conversion.go b/cty/convert/conversion.go index bc79df8..423b62f 100644 --- a/cty/convert/conversion.go +++ b/cty/convert/conversion.go @@ -171,12 +171,16 @@ func getConversionKnown(in cty.Type, out cty.Type, unsafe bool) conversion { } if out.IsCapsuleType() { if fn := out.CapsuleOps().ConversionTo; fn != nil { - return conversionToCapsule(in, out, fn) + if conv := conversionToCapsule(in, out, fn); conv != nil { + return conv + } } } if in.IsCapsuleType() { if fn := in.CapsuleOps().ConversionFrom; fn != nil { - return conversionFromCapsule(in, out, fn) + if conv := conversionFromCapsule(in, out, fn); conv != nil { + return conv + } } } // No conversion operation is available, then. diff --git a/cty/convert/conversion_capsule_test.go b/cty/convert/conversion_capsule_test.go index 6493965..c3aa670 100644 --- a/cty/convert/conversion_capsule_test.go +++ b/cty/convert/conversion_capsule_test.go @@ -46,6 +46,20 @@ func TestConvertCapsuleType(t *testing.T) { return cty.CapsuleVal(capTy, &s) } + capIntTy := cty.CapsuleWithOps("int test thingy", reflect.TypeOf(0), &cty.CapsuleOps{ + ConversionFrom: func(src cty.Type) func(interface{}, cty.Path) (cty.Value, error) { + if src.Equals(capTy) { + return func(v interface{}, p cty.Path) (cty.Value, error) { + return capVal(fmt.Sprintf("%d", *(v.(*int)))), nil + } + } + return nil + }, + }) + capIntVal := func(i int) cty.Value { + return cty.CapsuleVal(capIntTy, &i) + } + tests := []struct { From cty.Value To cty.Type @@ -102,6 +116,11 @@ func TestConvertCapsuleType(t *testing.T) { To: cty.Bool, WantErr: `bool required`, }, + { + From: capIntVal(42), + To: capTy, + Want: capVal("42"), + }, } for _, test := range tests {