diff --git a/tlv/primitive.go b/tlv/primitive.go index d241d273d..fb8bb70c3 100644 --- a/tlv/primitive.go +++ b/tlv/primitive.go @@ -375,16 +375,22 @@ func DBigSize(r io.Reader, val interface{}, buf *[8]byte, l uint64) error { return NewTypeForDecodingErr(val, "BigSize", l, 8) } +// constraintUint32Or64 is a type constraint for uint32 or uint64 types. +type constraintUint32Or64 interface { + uint32 | uint64 +} + // SizeBigSize returns a SizeFunc that can compute the length of BigSize. -func SizeBigSize(val interface{}) SizeFunc { +func SizeBigSize[T constraintUint32Or64](val *T) SizeFunc { var size uint64 - if i, ok := val.(*uint32); ok { - size = VarIntSize(uint64(*i)) - } - - if i, ok := val.(*uint64); ok { + switch i := any(val).(type) { + case *uint32: size = VarIntSize(uint64(*i)) + case *uint64: + size = VarIntSize(*i) + default: + panic(fmt.Sprintf("unexpected type %T for SizeBigSize", val)) } return func() uint64 { diff --git a/tlv/record.go b/tlv/record.go index 7813ee771..255f2b77f 100644 --- a/tlv/record.go +++ b/tlv/record.go @@ -273,14 +273,14 @@ func SortRecords(records []Record) { // // NOTE: for uint32, we would only gain space reduction if the encoded value is // no greater than 65535, which requires at most 3 bytes to encode. -func MakeBigSizeRecord(typ Type, val interface{}) Record { +func MakeBigSizeRecord[T constraintUint32Or64](typ Type, val *T) Record { var ( staticSize uint64 sizeFunc SizeFunc encoder Encoder decoder Decoder ) - switch val.(type) { + switch any(val).(type) { case *uint32: sizeFunc = SizeBigSize(val) encoder = EBigSize