@@ -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