func DecodeItemKey()

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
}