Skip to content

Commit 43cd678

Browse files
committed
implement encoding/decoding
1 parent d3f8a1b commit 43cd678

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

tftypes/value_msgpack.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,21 @@ func msgpackUnmarshalUnknown(dec *msgpack.Decoder, typ Type, path *AttributePath
479479
} else {
480480
newRefinements[keyCode] = refinement.NewNumberUpperBound(boundVal, inclusiveVal)
481481
}
482+
case refinement.KeyCollectionLengthLowerBound, refinement.KeyCollectionLengthUpperBound:
483+
if !typ.Is(List{}) && !typ.Is(Map{}) && !typ.Is(Set{}) {
484+
return Value{}, path.NewErrorf("failed to decode msgpack extension body: length bound refinement for non-collection type")
485+
}
486+
487+
boundVal, err := rfnDec.DecodeInt()
488+
if err != nil {
489+
return Value{}, path.NewErrorf("failed to decode msgpack extension body: length bound refinement must be integer")
490+
}
491+
492+
if keyCode == refinement.KeyCollectionLengthLowerBound {
493+
newRefinements[keyCode] = refinement.NewCollectionLengthLowerBound(int64(boundVal))
494+
} else {
495+
newRefinements[keyCode] = refinement.NewCollectionLengthUpperBound(int64(boundVal))
496+
}
482497
default:
483498
err := rfnDec.Skip()
484499
if err != nil {
@@ -638,6 +653,30 @@ func marshalUnknownValue(val Value, typ Type, p *AttributePath, enc *msgpack.Enc
638653
return p.NewErrorf("error encoding NumberUpperBound value refinement: %w", err)
639654
}
640655

656+
mapLen++
657+
case refinement.CollectionLengthLowerBound:
658+
err := refnEnc.EncodeInt(int64(refinement.KeyCollectionLengthLowerBound))
659+
if err != nil {
660+
return p.NewErrorf("error encoding CollectionLengthLowerBound value refinement key: %w", err)
661+
}
662+
663+
err = refnEnc.EncodeInt(refnVal.LowerBound())
664+
if err != nil {
665+
return p.NewErrorf("error encoding CollectionLengthLowerBound value refinement: %w", err)
666+
}
667+
668+
mapLen++
669+
case refinement.CollectionLengthUpperBound:
670+
err := refnEnc.EncodeInt(int64(refinement.KeyCollectionLengthUpperBound))
671+
if err != nil {
672+
return p.NewErrorf("error encoding CollectionLengthUpperBound value refinement key: %w", err)
673+
}
674+
675+
err = refnEnc.EncodeInt(refnVal.UpperBound())
676+
if err != nil {
677+
return p.NewErrorf("error encoding CollectionLengthUpperBound value refinement: %w", err)
678+
}
679+
641680
mapLen++
642681
default:
643682
continue

0 commit comments

Comments
 (0)