in dax/internal/cbor/attrval.go [149:295]
func DecodeAttributeValue(reader *Reader) (types.AttributeValue, error) {
hdr, err := reader.PeekHeader()
if err != nil {
return nil, err
}
major := hdr & MajorTypeMask
minor := hdr & MinorTypeMask
switch major {
case Utf:
s, err := reader.ReadString()
if err != nil {
return nil, err
}
return &types.AttributeValueMemberS{Value: s}, nil
case Bytes:
b, err := reader.ReadBytes()
if err != nil {
return nil, err
}
return &types.AttributeValueMemberB{Value: b}, nil
case Array:
len, err := reader.ReadArrayLength()
if err != nil {
return nil, err
}
as := make([]types.AttributeValue, len)
for i := 0; i < len; i++ {
a, err := DecodeAttributeValue(reader)
if err != nil {
return nil, err
}
as[i] = a
}
return &types.AttributeValueMemberL{Value: as}, nil
case Map:
len, err := reader.ReadMapLength()
if err != nil {
return nil, err
}
m := make(map[string]types.AttributeValue, len)
for i := 0; i < len; i++ {
k, err := reader.ReadString()
if err != nil {
return nil, err
}
v, err := DecodeAttributeValue(reader)
if err != nil {
return nil, err
}
m[k] = v
}
return &types.AttributeValueMemberM{Value: m}, nil
case PosInt, NegInt:
s, err := reader.ReadCborIntegerToString()
if err != nil {
return nil, err
}
return &types.AttributeValueMemberN{Value: s}, nil
case Simple:
if _, _, err := reader.readTypeHeader(); err != nil {
return nil, err
}
switch hdr {
case False:
return &types.AttributeValueMemberBOOL{Value: false}, nil
case True:
return &types.AttributeValueMemberBOOL{Value: true}, nil
case Nil:
return &types.AttributeValueMemberNULL{Value: true}, nil
default:
return nil, &smithy.DeserializationError{Err: fmt.Errorf("unknown minor type %d for simple major type", minor)}
}
case Tag:
switch minor {
case TagPosBigInt, TagNegBigInt:
i, err := reader.ReadBigInt()
if err != nil {
return nil, err
}
return &types.AttributeValueMemberN{Value: i.String()}, nil
case TagDecimal:
d, err := reader.ReadDecimal()
if err != nil {
return nil, err
}
return &types.AttributeValueMemberN{Value: d.String()}, nil
default:
_, tag, err := reader.readTypeHeader()
if err != nil {
return nil, err
}
switch tag {
case tagStringSet:
len, err := reader.ReadArrayLength()
if err != nil {
return nil, err
}
ss := make([]string, len)
for i := 0; i < len; i++ {
s, err := reader.ReadString()
if err != nil {
return nil, err
}
ss[i] = s
}
return &types.AttributeValueMemberSS{Value: ss}, nil
case tagNumberSet:
len, err := reader.ReadArrayLength()
if err != nil {
return nil, err
}
ss := make([]string, len)
for i := 0; i < len; i++ {
av, err := DecodeAttributeValue(reader)
if err != nil {
return nil, err
}
n, ok := av.(*types.AttributeValueMemberN)
if !ok {
return nil, &smithy.DeserializationError{Err: fmt.Errorf("attribute type is not number. type: %T", av)}
}
ss[i] = n.Value
}
return &types.AttributeValueMemberNS{Value: ss}, nil
case tagBinarySet:
len, err := reader.ReadArrayLength()
if err != nil {
return nil, err
}
bs := make([][]byte, len)
for i := 0; i < len; i++ {
b, err := reader.ReadBytes()
if err != nil {
return nil, err
}
bs[i] = b
}
return &types.AttributeValueMemberBS{Value: bs}, nil
default:
return nil, &smithy.DeserializationError{Err: fmt.Errorf("unknown minor type %d or tag %d", minor, tag)}
}
}
default:
return nil, &smithy.DeserializationError{Err: fmt.Errorf("unknown major type %d", major)}
}
}