func DecodeItemKey()

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
}