func DecodeAttributeValue()

in dax/internal/cbor/attrval.go [149:295]


func DecodeAttributeValue(reader *Reader) (types.AttributeValue, error) {
	hdr, err := reader.PeekHeader()
	if err != nil {
		return nil, err
	}
	major := hdr & MajorTypeMask
	minor := hdr & MinorTypeMask

	switch major {
	case Utf:
		s, err := reader.ReadString()
		if err != nil {
			return nil, err
		}
		return &types.AttributeValueMemberS{Value: s}, nil
	case Bytes:
		b, err := reader.ReadBytes()
		if err != nil {
			return nil, err
		}
		return &types.AttributeValueMemberB{Value: b}, nil
	case Array:
		len, err := reader.ReadArrayLength()
		if err != nil {
			return nil, err
		}
		as := make([]types.AttributeValue, len)
		for i := 0; i < len; i++ {
			a, err := DecodeAttributeValue(reader)
			if err != nil {
				return nil, err
			}
			as[i] = a
		}
		return &types.AttributeValueMemberL{Value: as}, nil
	case Map:
		len, err := reader.ReadMapLength()
		if err != nil {
			return nil, err
		}
		m := make(map[string]types.AttributeValue, len)
		for i := 0; i < len; i++ {
			k, err := reader.ReadString()
			if err != nil {
				return nil, err
			}
			v, err := DecodeAttributeValue(reader)
			if err != nil {
				return nil, err
			}
			m[k] = v
		}
		return &types.AttributeValueMemberM{Value: m}, nil
	case PosInt, NegInt:
		s, err := reader.ReadCborIntegerToString()
		if err != nil {
			return nil, err
		}
		return &types.AttributeValueMemberN{Value: s}, nil
	case Simple:
		if _, _, err := reader.readTypeHeader(); err != nil {
			return nil, err
		}
		switch hdr {
		case False:
			return &types.AttributeValueMemberBOOL{Value: false}, nil
		case True:
			return &types.AttributeValueMemberBOOL{Value: true}, nil
		case Nil:
			return &types.AttributeValueMemberNULL{Value: true}, nil
		default:
			return nil, &smithy.DeserializationError{Err: fmt.Errorf("unknown minor type %d for simple major type", minor)}
		}
	case Tag:
		switch minor {
		case TagPosBigInt, TagNegBigInt:
			i, err := reader.ReadBigInt()
			if err != nil {
				return nil, err
			}
			return &types.AttributeValueMemberN{Value: i.String()}, nil
		case TagDecimal:
			d, err := reader.ReadDecimal()
			if err != nil {
				return nil, err
			}
			return &types.AttributeValueMemberN{Value: d.String()}, nil
		default:
			_, tag, err := reader.readTypeHeader()
			if err != nil {
				return nil, err
			}
			switch tag {
			case tagStringSet:
				len, err := reader.ReadArrayLength()
				if err != nil {
					return nil, err
				}
				ss := make([]string, len)
				for i := 0; i < len; i++ {
					s, err := reader.ReadString()
					if err != nil {
						return nil, err
					}
					ss[i] = s
				}
				return &types.AttributeValueMemberSS{Value: ss}, nil
			case tagNumberSet:
				len, err := reader.ReadArrayLength()
				if err != nil {
					return nil, err
				}
				ss := make([]string, len)
				for i := 0; i < len; i++ {
					av, err := DecodeAttributeValue(reader)
					if err != nil {
						return nil, err
					}
					n, ok := av.(*types.AttributeValueMemberN)
					if !ok {
						return nil, &smithy.DeserializationError{Err: fmt.Errorf("attribute type is not number. type: %T", av)}
					}
					ss[i] = n.Value
				}
				return &types.AttributeValueMemberNS{Value: ss}, nil
			case tagBinarySet:
				len, err := reader.ReadArrayLength()
				if err != nil {
					return nil, err
				}
				bs := make([][]byte, len)
				for i := 0; i < len; i++ {
					b, err := reader.ReadBytes()
					if err != nil {
						return nil, err
					}
					bs[i] = b
				}
				return &types.AttributeValueMemberBS{Value: bs}, nil
			default:
				return nil, &smithy.DeserializationError{Err: fmt.Errorf("unknown minor type %d or tag %d", minor, tag)}
			}
		}
	default:
		return nil, &smithy.DeserializationError{Err: fmt.Errorf("unknown major type %d", major)}
	}
}