in dax/internal/cbor/item.go [157:253]
func DecodeItemKey(reader *Reader, keydef []dynamodb.AttributeDefinition) (map[string]*dynamodb.AttributeValue, error) {
hk := keydef[0]
keys := make(map[string]*dynamodb.AttributeValue)
if len(keydef) == 1 {
switch *hk.AttributeType {
case dynamodb.ScalarAttributeTypeS:
kb, err := reader.ReadBytes()
if err != nil {
return nil, err
}
s := string(kb)
keys[*hk.AttributeName] = &dynamodb.AttributeValue{S: &s}
case dynamodb.ScalarAttributeTypeN:
r, err := reader.BytesReader()
if err != nil {
return nil, err
}
defer r.Close()
av, err := DecodeAttributeValue(r)
if err != nil {
return nil, err
}
if av.N == nil {
return nil, ErrMissingKey
}
keys[*hk.AttributeName] = av
case dynamodb.ScalarAttributeTypeB:
kb, err := reader.ReadBytes()
if err != nil {
return nil, err
}
keys[*hk.AttributeName] = &dynamodb.AttributeValue{B: kb}
default:
return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("Unsupported KeyType encountered in Hash Attribute: "+*hk.AttributeType), nil)
}
} else {
r, err := reader.BytesReader()
if err != nil {
return nil, err
}
defer r.Close()
switch *hk.AttributeType {
case dynamodb.ScalarAttributeTypeS:
s, err := r.ReadString()
if err != nil {
return nil, err
}
keys[*hk.AttributeName] = &dynamodb.AttributeValue{S: &s}
case dynamodb.ScalarAttributeTypeN:
av, err := DecodeAttributeValue(r)
if err != nil {
return nil, err
}
if av.N == nil {
return nil, ErrMissingKey
}
keys[*hk.AttributeName] = av
case dynamodb.ScalarAttributeTypeB:
b, err := r.ReadBytes()
if err != nil {
return nil, err
}
keys[*hk.AttributeName] = &dynamodb.AttributeValue{B: b}
default:
return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("Unsupported KeyType encountered in Hash Attribute: "+*hk.AttributeType), nil)
}
rk := keydef[1]
switch *rk.AttributeType {
case dynamodb.ScalarAttributeTypeS:
var buf bytes.Buffer
if _, err := r.br.WriteTo(&buf); err != nil {
return nil, err
}
s := string(buf.Bytes())
keys[*rk.AttributeName] = &dynamodb.AttributeValue{S: &s}
case dynamodb.ScalarAttributeTypeN:
d, err := DecodeLexDecimal(r.br)
if err != nil {
return nil, err
}
s := d.String()
keys[*rk.AttributeName] = &dynamodb.AttributeValue{N: &s}
case dynamodb.ScalarAttributeTypeB:
var buf bytes.Buffer
if _, err := r.br.WriteTo(&buf); err != nil {
return nil, err
}
keys[*rk.AttributeName] = &dynamodb.AttributeValue{B: buf.Bytes()}
default:
return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("Unsupported KeyType encountered in Range Attribute: "+*rk.AttributeType), nil)
}
}
return keys, nil
}