in dax/internal/cbor/item.go [170:268]
func DecodeItemKey(reader *Reader, keydef []types.AttributeDefinition) (map[string]types.AttributeValue, error) {
hk := keydef[0]
keys := make(map[string]types.AttributeValue)
if len(keydef) == 1 {
switch hk.AttributeType {
case types.ScalarAttributeTypeS:
kb, err := reader.ReadBytes()
if err != nil {
return nil, err
}
s := string(kb)
keys[*hk.AttributeName] = &types.AttributeValueMemberS{Value: s}
case types.ScalarAttributeTypeN:
r, err := reader.BytesReader()
if err != nil {
return nil, err
}
defer r.Close()
av, err := DecodeAttributeValue(r)
if err != nil {
return nil, err
}
_, isExpectedType := av.(*types.AttributeValueMemberN)
if !isExpectedType {
return nil, ErrMissingKey
}
keys[*hk.AttributeName] = av
case types.ScalarAttributeTypeB:
kb, err := reader.ReadBytes()
if err != nil {
return nil, err
}
keys[*hk.AttributeName] = &types.AttributeValueMemberB{Value: kb}
default:
return nil, fmt.Errorf("unsupported KeyType encountered in Hash Attribute: %s", hk.AttributeType)
}
} else {
r, err := reader.BytesReader()
if err != nil {
return nil, err
}
defer r.Close()
switch hk.AttributeType {
case types.ScalarAttributeTypeS:
s, err := r.ReadString()
if err != nil {
return nil, err
}
keys[*hk.AttributeName] = &types.AttributeValueMemberS{Value: s}
case types.ScalarAttributeTypeN:
av, err := DecodeAttributeValue(r)
if err != nil {
return nil, err
}
_, isExpectedType := av.(*types.AttributeValueMemberN)
if !isExpectedType {
return nil, ErrMissingKey
}
keys[*hk.AttributeName] = av
case types.ScalarAttributeTypeB:
b, err := r.ReadBytes()
if err != nil {
return nil, err
}
keys[*hk.AttributeName] = &types.AttributeValueMemberB{Value: b}
default:
return nil, fmt.Errorf("unsupported KeyType encountered in Hash Attribute: %s", hk.AttributeType)
}
rk := keydef[1]
switch rk.AttributeType {
case types.ScalarAttributeTypeS:
var buf bytes.Buffer
if _, err := r.br.WriteTo(&buf); err != nil {
return nil, err
}
s := string(buf.Bytes())
keys[*rk.AttributeName] = &types.AttributeValueMemberS{Value: s}
case types.ScalarAttributeTypeN:
d, err := DecodeLexDecimal(r.br)
if err != nil {
return nil, err
}
s := d.String()
keys[*rk.AttributeName] = &types.AttributeValueMemberN{Value: s}
case types.ScalarAttributeTypeB:
var buf bytes.Buffer
if _, err := r.br.WriteTo(&buf); err != nil {
return nil, err
}
keys[*rk.AttributeName] = &types.AttributeValueMemberB{Value: buf.Bytes()}
default:
return nil, fmt.Errorf("unsupported KeyType encountered in Range Attribute: %s", rk.AttributeType)
}
}
return keys, nil
}