in dax/internal/cbor/attrval.go [140:282]
func DecodeAttributeValue(reader *Reader) (*dynamodb.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 &dynamodb.AttributeValue{S: &s}, nil
case Bytes:
b, err := reader.ReadBytes()
if err != nil {
return nil, err
}
return &dynamodb.AttributeValue{B: b}, nil
case Array:
len, err := reader.ReadArrayLength()
if err != nil {
return nil, err
}
as := make([]*dynamodb.AttributeValue, len)
for i := 0; i < len; i++ {
a, err := DecodeAttributeValue(reader)
if err != nil {
return nil, err
}
as[i] = a
}
return &dynamodb.AttributeValue{L: as}, nil
case Map:
len, err := reader.ReadMapLength()
if err != nil {
return nil, err
}
m := make(map[string]*dynamodb.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 &dynamodb.AttributeValue{M: m}, nil
case PosInt, NegInt:
s, err := reader.ReadCborIntegerToString()
if err != nil {
return nil, err
}
return &dynamodb.AttributeValue{N: &s}, nil
case Simple:
if _, _, err := reader.readTypeHeader(); err != nil {
return nil, err
}
switch hdr {
case False:
return &dynamodb.AttributeValue{BOOL: aws.Bool(false)}, nil
case True:
return &dynamodb.AttributeValue{BOOL: aws.Bool(true)}, nil
case Nil:
return &dynamodb.AttributeValue{NULL: aws.Bool(true)}, nil
default:
return nil, awserr.New(request.ErrCodeSerialization, fmt.Sprintf("unknown minor type %d for simple major type", minor), nil)
}
case Tag:
switch minor {
case TagPosBigInt, TagNegBigInt:
i, err := reader.ReadBigInt()
if err != nil {
return nil, err
}
return &dynamodb.AttributeValue{N: aws.String(i.String())}, nil
case TagDecimal:
d, err := reader.ReadDecimal()
if err != nil {
return nil, err
}
return &dynamodb.AttributeValue{N: aws.String(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 &dynamodb.AttributeValue{SS: 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
}
ss[i] = av.N
}
return &dynamodb.AttributeValue{NS: 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 &dynamodb.AttributeValue{BS: bs}, nil
default:
return nil, awserr.New(request.ErrCodeSerialization, fmt.Sprintf("unknown minor type %d or tag %d", minor, tag), nil)
}
}
default:
return nil, awserr.New(request.ErrCodeSerialization, fmt.Sprintf("unknown major type %d", major), nil)
}
}