func GetEncodedItemKey()

in dax/internal/cbor/item.go [39:155]


func GetEncodedItemKey(item map[string]*dynamodb.AttributeValue, keydef []dynamodb.AttributeDefinition) ([]byte, error) {
	if item == nil {
		return nil, awserr.New(request.InvalidParameterErrCode, "item cannot be nil", nil)
	}

	hk := keydef[0]
	hkval, ok := item[*hk.AttributeName]
	if !ok {
		return nil, ErrMissingKey
	}

	var buf bytes.Buffer
	w := NewWriter(&buf)
	defer w.Close()

	if len(keydef) == 1 {
		switch *hk.AttributeType {
		case dynamodb.ScalarAttributeTypeS:
			sp := hkval.S
			if sp == nil {
				return nil, ErrMissingKey
			}
			if err := w.Write([]byte(*sp)); err != nil {
				return nil, err
			}
		case dynamodb.ScalarAttributeTypeN:
			if hkval.N == nil {
				return nil, ErrMissingKey
			}
			if err := EncodeAttributeValue(hkval, w); err != nil {
				return nil, err
			}
		case dynamodb.ScalarAttributeTypeB:
			b := hkval.B
			if b == nil {
				return nil, ErrMissingKey
			}
			if err := w.Write(b); err != nil {
				return nil, err
			}
		default:
			return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("Unsupported KeyType encountered in Hash Attribute: "+*hk.AttributeType), nil)
		}
	} else {
		switch *hk.AttributeType {
		case dynamodb.ScalarAttributeTypeS:
			sp := hkval.S
			if sp == nil {
				return nil, ErrMissingKey
			}
			if err := w.WriteString(*sp); err != nil {
				return nil, err
			}
		case dynamodb.ScalarAttributeTypeN:
			if hkval.N == nil {
				return nil, ErrMissingKey
			}
			if err := EncodeAttributeValue(hkval, w); err != nil {
				return nil, err
			}
		case dynamodb.ScalarAttributeTypeB:
			b := hkval.B
			if b == nil {
				return nil, ErrMissingKey
			}
			if err := w.WriteBytes(b); err != nil {
				return nil, err
			}
		default:
			return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("Unsupported KeyType encountered in Hash Attribute: "+*hk.AttributeType), nil)
		}

		rk := keydef[1]
		rkval, ok := item[*rk.AttributeName]
		if !ok {
			return nil, ErrMissingKey
		}
		switch *rk.AttributeType {
		case dynamodb.ScalarAttributeTypeS:
			sp := rkval.S
			if sp == nil {
				return nil, ErrMissingKey
			}
			if err := w.Write([]byte(*sp)); err != nil {
				return nil, err
			}
		case dynamodb.ScalarAttributeTypeN:
			n := rkval.N
			if n == nil {
				return nil, ErrMissingKey
			}
			d := new(Decimal)
			d, ok := d.SetString(*n)
			if !ok {
				return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("invalid number "+*n), nil)
			}
			if _, err := EncodeLexDecimal(d, w.bw); err != nil {
				return nil, err
			}
		case dynamodb.ScalarAttributeTypeB:
			b := rkval.B
			if b == nil {
				return nil, ErrMissingKey
			}
			if err := w.Write(b); err != nil {
				return nil, err
			}
		default:
			return nil, awserr.New(request.InvalidParameterErrCode, fmt.Sprintf("Unsupported KeyType encountered in Range Attribute: "+*rk.AttributeType), nil)
		}
	}

	if err := w.Flush(); err != nil {
		return nil, err
	}
	return buf.Bytes(), nil
}