// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v3/enums/feed_attribute_type.proto

package enums

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Possible data types for a feed attribute.
type FeedAttributeTypeEnum_FeedAttributeType int32

const (
	// Not specified.
	FeedAttributeTypeEnum_UNSPECIFIED FeedAttributeTypeEnum_FeedAttributeType = 0
	// Used for return value only. Represents value unknown in this version.
	FeedAttributeTypeEnum_UNKNOWN FeedAttributeTypeEnum_FeedAttributeType = 1
	// Int64.
	FeedAttributeTypeEnum_INT64 FeedAttributeTypeEnum_FeedAttributeType = 2
	// Double.
	FeedAttributeTypeEnum_DOUBLE FeedAttributeTypeEnum_FeedAttributeType = 3
	// String.
	FeedAttributeTypeEnum_STRING FeedAttributeTypeEnum_FeedAttributeType = 4
	// Boolean.
	FeedAttributeTypeEnum_BOOLEAN FeedAttributeTypeEnum_FeedAttributeType = 5
	// Url.
	FeedAttributeTypeEnum_URL FeedAttributeTypeEnum_FeedAttributeType = 6
	// Datetime.
	FeedAttributeTypeEnum_DATE_TIME FeedAttributeTypeEnum_FeedAttributeType = 7
	// Int64 list.
	FeedAttributeTypeEnum_INT64_LIST FeedAttributeTypeEnum_FeedAttributeType = 8
	// Double (8 bytes) list.
	FeedAttributeTypeEnum_DOUBLE_LIST FeedAttributeTypeEnum_FeedAttributeType = 9
	// String list.
	FeedAttributeTypeEnum_STRING_LIST FeedAttributeTypeEnum_FeedAttributeType = 10
	// Boolean list.
	FeedAttributeTypeEnum_BOOLEAN_LIST FeedAttributeTypeEnum_FeedAttributeType = 11
	// Url list.
	FeedAttributeTypeEnum_URL_LIST FeedAttributeTypeEnum_FeedAttributeType = 12
	// Datetime list.
	FeedAttributeTypeEnum_DATE_TIME_LIST FeedAttributeTypeEnum_FeedAttributeType = 13
	// Price.
	FeedAttributeTypeEnum_PRICE FeedAttributeTypeEnum_FeedAttributeType = 14
)

// Enum value maps for FeedAttributeTypeEnum_FeedAttributeType.
var (
	FeedAttributeTypeEnum_FeedAttributeType_name = map[int32]string{
		0:  "UNSPECIFIED",
		1:  "UNKNOWN",
		2:  "INT64",
		3:  "DOUBLE",
		4:  "STRING",
		5:  "BOOLEAN",
		6:  "URL",
		7:  "DATE_TIME",
		8:  "INT64_LIST",
		9:  "DOUBLE_LIST",
		10: "STRING_LIST",
		11: "BOOLEAN_LIST",
		12: "URL_LIST",
		13: "DATE_TIME_LIST",
		14: "PRICE",
	}
	FeedAttributeTypeEnum_FeedAttributeType_value = map[string]int32{
		"UNSPECIFIED":    0,
		"UNKNOWN":        1,
		"INT64":          2,
		"DOUBLE":         3,
		"STRING":         4,
		"BOOLEAN":        5,
		"URL":            6,
		"DATE_TIME":      7,
		"INT64_LIST":     8,
		"DOUBLE_LIST":    9,
		"STRING_LIST":    10,
		"BOOLEAN_LIST":   11,
		"URL_LIST":       12,
		"DATE_TIME_LIST": 13,
		"PRICE":          14,
	}
)

func (x FeedAttributeTypeEnum_FeedAttributeType) Enum() *FeedAttributeTypeEnum_FeedAttributeType {
	p := new(FeedAttributeTypeEnum_FeedAttributeType)
	*p = x
	return p
}

func (x FeedAttributeTypeEnum_FeedAttributeType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (FeedAttributeTypeEnum_FeedAttributeType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_feed_attribute_type_proto_enumTypes[0].Descriptor()
}

func (FeedAttributeTypeEnum_FeedAttributeType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_feed_attribute_type_proto_enumTypes[0]
}

func (x FeedAttributeTypeEnum_FeedAttributeType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use FeedAttributeTypeEnum_FeedAttributeType.Descriptor instead.
func (FeedAttributeTypeEnum_FeedAttributeType) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing possible data types for a feed attribute.
type FeedAttributeTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *FeedAttributeTypeEnum) Reset() {
	*x = FeedAttributeTypeEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v3_enums_feed_attribute_type_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *FeedAttributeTypeEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*FeedAttributeTypeEnum) ProtoMessage() {}

func (x *FeedAttributeTypeEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v3_enums_feed_attribute_type_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use FeedAttributeTypeEnum.ProtoReflect.Descriptor instead.
func (*FeedAttributeTypeEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_enums_feed_attribute_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDesc = []byte{
	0x0a, 0x37, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x66, 0x65, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x5f, 0x74,
	0x79, 0x70, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e,
	0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x84, 0x02, 0x0a, 0x15, 0x46, 0x65, 0x65, 0x64, 0x41,
	0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d,
	0x22, 0xea, 0x01, 0x0a, 0x11, 0x46, 0x65, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
	0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f,
	0x57, 0x4e, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x49, 0x4e, 0x54, 0x36, 0x34, 0x10, 0x02, 0x12,
	0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53,
	0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45,
	0x41, 0x4e, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x10, 0x06, 0x12, 0x0d, 0x0a,
	0x09, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x07, 0x12, 0x0e, 0x0a, 0x0a,
	0x49, 0x4e, 0x54, 0x36, 0x34, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b,
	0x44, 0x4f, 0x55, 0x42, 0x4c, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x09, 0x12, 0x0f, 0x0a,
	0x0b, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x0a, 0x12, 0x10,
	0x0a, 0x0c, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x0b,
	0x12, 0x0c, 0x0a, 0x08, 0x55, 0x52, 0x4c, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x0c, 0x12, 0x12,
	0x0a, 0x0e, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54,
	0x10, 0x0d, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x52, 0x49, 0x43, 0x45, 0x10, 0x0e, 0x42, 0xeb, 0x01,
	0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e,
	0x75, 0x6d, 0x73, 0x42, 0x16, 0x46, 0x65, 0x65, 0x64, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
	0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67,
	0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61,
	0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d,
	0x73, 0xa2, 0x02, 0x03, 0x47, 0x41, 0x41, 0xaa, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56,
	0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xca, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56,
	0x33, 0x5c, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0xea, 0x02, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73,
	0x3a, 0x3a, 0x56, 0x33, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescData = file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_feed_attribute_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_feed_attribute_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_feed_attribute_type_proto_goTypes = []interface{}{
	(FeedAttributeTypeEnum_FeedAttributeType)(0), // 0: google.ads.googleads.v3.enums.FeedAttributeTypeEnum.FeedAttributeType
	(*FeedAttributeTypeEnum)(nil),                // 1: google.ads.googleads.v3.enums.FeedAttributeTypeEnum
}
var file_google_ads_googleads_v3_enums_feed_attribute_type_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v3_enums_feed_attribute_type_proto_init() }
func file_google_ads_googleads_v3_enums_feed_attribute_type_proto_init() {
	if File_google_ads_googleads_v3_enums_feed_attribute_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_feed_attribute_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*FeedAttributeTypeEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_feed_attribute_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_feed_attribute_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_feed_attribute_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_feed_attribute_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_feed_attribute_type_proto = out.File
	file_google_ads_googleads_v3_enums_feed_attribute_type_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_feed_attribute_type_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_feed_attribute_type_proto_depIdxs = nil
}
