// 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/ad_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

// The possible types of an ad.
type AdTypeEnum_AdType int32

const (
	// No value has been specified.
	AdTypeEnum_UNSPECIFIED AdTypeEnum_AdType = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	AdTypeEnum_UNKNOWN AdTypeEnum_AdType = 1
	// The ad is a text ad.
	AdTypeEnum_TEXT_AD AdTypeEnum_AdType = 2
	// The ad is an expanded text ad.
	AdTypeEnum_EXPANDED_TEXT_AD AdTypeEnum_AdType = 3
	// The ad is a call only ad.
	AdTypeEnum_CALL_ONLY_AD AdTypeEnum_AdType = 6
	// The ad is an expanded dynamic search ad.
	AdTypeEnum_EXPANDED_DYNAMIC_SEARCH_AD AdTypeEnum_AdType = 7
	// The ad is a hotel ad.
	AdTypeEnum_HOTEL_AD AdTypeEnum_AdType = 8
	// The ad is a Smart Shopping ad.
	AdTypeEnum_SHOPPING_SMART_AD AdTypeEnum_AdType = 9
	// The ad is a standard Shopping ad.
	AdTypeEnum_SHOPPING_PRODUCT_AD AdTypeEnum_AdType = 10
	// The ad is a video ad.
	AdTypeEnum_VIDEO_AD AdTypeEnum_AdType = 12
	// This ad is a Gmail ad.
	AdTypeEnum_GMAIL_AD AdTypeEnum_AdType = 13
	// This ad is an Image ad.
	AdTypeEnum_IMAGE_AD AdTypeEnum_AdType = 14
	// The ad is a responsive search ad.
	AdTypeEnum_RESPONSIVE_SEARCH_AD AdTypeEnum_AdType = 15
	// The ad is a legacy responsive display ad.
	AdTypeEnum_LEGACY_RESPONSIVE_DISPLAY_AD AdTypeEnum_AdType = 16
	// The ad is an app ad.
	AdTypeEnum_APP_AD AdTypeEnum_AdType = 17
	// The ad is a legacy app install ad.
	AdTypeEnum_LEGACY_APP_INSTALL_AD AdTypeEnum_AdType = 18
	// The ad is a responsive display ad.
	AdTypeEnum_RESPONSIVE_DISPLAY_AD AdTypeEnum_AdType = 19
	// The ad is a display upload ad with the HTML5_UPLOAD_AD product type.
	AdTypeEnum_HTML5_UPLOAD_AD AdTypeEnum_AdType = 21
	// The ad is a display upload ad with one of the DYNAMIC_HTML5_* product
	// types.
	AdTypeEnum_DYNAMIC_HTML5_AD AdTypeEnum_AdType = 22
	// The ad is an app engagement ad.
	AdTypeEnum_APP_ENGAGEMENT_AD AdTypeEnum_AdType = 23
	// The ad is a Shopping Comparison Listing ad.
	AdTypeEnum_SHOPPING_COMPARISON_LISTING_AD AdTypeEnum_AdType = 24
	// Video responsive ad.
	AdTypeEnum_VIDEO_RESPONSIVE_AD AdTypeEnum_AdType = 30
)

// Enum value maps for AdTypeEnum_AdType.
var (
	AdTypeEnum_AdType_name = map[int32]string{
		0:  "UNSPECIFIED",
		1:  "UNKNOWN",
		2:  "TEXT_AD",
		3:  "EXPANDED_TEXT_AD",
		6:  "CALL_ONLY_AD",
		7:  "EXPANDED_DYNAMIC_SEARCH_AD",
		8:  "HOTEL_AD",
		9:  "SHOPPING_SMART_AD",
		10: "SHOPPING_PRODUCT_AD",
		12: "VIDEO_AD",
		13: "GMAIL_AD",
		14: "IMAGE_AD",
		15: "RESPONSIVE_SEARCH_AD",
		16: "LEGACY_RESPONSIVE_DISPLAY_AD",
		17: "APP_AD",
		18: "LEGACY_APP_INSTALL_AD",
		19: "RESPONSIVE_DISPLAY_AD",
		21: "HTML5_UPLOAD_AD",
		22: "DYNAMIC_HTML5_AD",
		23: "APP_ENGAGEMENT_AD",
		24: "SHOPPING_COMPARISON_LISTING_AD",
		30: "VIDEO_RESPONSIVE_AD",
	}
	AdTypeEnum_AdType_value = map[string]int32{
		"UNSPECIFIED":                    0,
		"UNKNOWN":                        1,
		"TEXT_AD":                        2,
		"EXPANDED_TEXT_AD":               3,
		"CALL_ONLY_AD":                   6,
		"EXPANDED_DYNAMIC_SEARCH_AD":     7,
		"HOTEL_AD":                       8,
		"SHOPPING_SMART_AD":              9,
		"SHOPPING_PRODUCT_AD":            10,
		"VIDEO_AD":                       12,
		"GMAIL_AD":                       13,
		"IMAGE_AD":                       14,
		"RESPONSIVE_SEARCH_AD":           15,
		"LEGACY_RESPONSIVE_DISPLAY_AD":   16,
		"APP_AD":                         17,
		"LEGACY_APP_INSTALL_AD":          18,
		"RESPONSIVE_DISPLAY_AD":          19,
		"HTML5_UPLOAD_AD":                21,
		"DYNAMIC_HTML5_AD":               22,
		"APP_ENGAGEMENT_AD":              23,
		"SHOPPING_COMPARISON_LISTING_AD": 24,
		"VIDEO_RESPONSIVE_AD":            30,
	}
)

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

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

func (AdTypeEnum_AdType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_ad_type_proto_enumTypes[0].Descriptor()
}

func (AdTypeEnum_AdType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_ad_type_proto_enumTypes[0]
}

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

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

// Container for enum describing possible types of an ad.
type AdTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*AdTypeEnum) ProtoMessage() {}

func (x *AdTypeEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v3_enums_ad_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 AdTypeEnum.ProtoReflect.Descriptor instead.
func (*AdTypeEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_ad_type_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_enums_ad_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_ad_type_proto_rawDesc = []byte{
	0x0a, 0x2b, 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,
	0x61, 0x64, 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, 0xef, 0x03, 0x0a, 0x0a, 0x41,
	0x64, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0xe0, 0x03, 0x0a, 0x06, 0x41, 0x64,
	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, 0x0b, 0x0a, 0x07, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x41, 0x44, 0x10, 0x02, 0x12,
	0x14, 0x0a, 0x10, 0x45, 0x58, 0x50, 0x41, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x54, 0x45, 0x58, 0x54,
	0x5f, 0x41, 0x44, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x4f, 0x4e,
	0x4c, 0x59, 0x5f, 0x41, 0x44, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x58, 0x50, 0x41, 0x4e,
	0x44, 0x45, 0x44, 0x5f, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x53, 0x45, 0x41, 0x52,
	0x43, 0x48, 0x5f, 0x41, 0x44, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x48, 0x4f, 0x54, 0x45, 0x4c,
	0x5f, 0x41, 0x44, 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x48, 0x4f, 0x50, 0x50, 0x49, 0x4e,
	0x47, 0x5f, 0x53, 0x4d, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x44, 0x10, 0x09, 0x12, 0x17, 0x0a, 0x13,
	0x53, 0x48, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x52, 0x4f, 0x44, 0x55, 0x43, 0x54,
	0x5f, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x49, 0x44, 0x45, 0x4f, 0x5f, 0x41,
	0x44, 0x10, 0x0c, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4d, 0x41, 0x49, 0x4c, 0x5f, 0x41, 0x44, 0x10,
	0x0d, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x41, 0x44, 0x10, 0x0e, 0x12,
	0x18, 0x0a, 0x14, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x53, 0x45,
	0x41, 0x52, 0x43, 0x48, 0x5f, 0x41, 0x44, 0x10, 0x0f, 0x12, 0x20, 0x0a, 0x1c, 0x4c, 0x45, 0x47,
	0x41, 0x43, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x44,
	0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x41, 0x44, 0x10, 0x10, 0x12, 0x0a, 0x0a, 0x06, 0x41,
	0x50, 0x50, 0x5f, 0x41, 0x44, 0x10, 0x11, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x45, 0x47, 0x41, 0x43,
	0x59, 0x5f, 0x41, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x5f, 0x41, 0x44,
	0x10, 0x12, 0x12, 0x19, 0x0a, 0x15, 0x52, 0x45, 0x53, 0x50, 0x4f, 0x4e, 0x53, 0x49, 0x56, 0x45,
	0x5f, 0x44, 0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x5f, 0x41, 0x44, 0x10, 0x13, 0x12, 0x13, 0x0a,
	0x0f, 0x48, 0x54, 0x4d, 0x4c, 0x35, 0x5f, 0x55, 0x50, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x41, 0x44,
	0x10, 0x15, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x59, 0x4e, 0x41, 0x4d, 0x49, 0x43, 0x5f, 0x48, 0x54,
	0x4d, 0x4c, 0x35, 0x5f, 0x41, 0x44, 0x10, 0x16, 0x12, 0x15, 0x0a, 0x11, 0x41, 0x50, 0x50, 0x5f,
	0x45, 0x4e, 0x47, 0x41, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x44, 0x10, 0x17, 0x12,
	0x22, 0x0a, 0x1e, 0x53, 0x48, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x5f, 0x43, 0x4f, 0x4d, 0x50,
	0x41, 0x52, 0x49, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x41,
	0x44, 0x10, 0x18, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x49, 0x44, 0x45, 0x4f, 0x5f, 0x52, 0x45, 0x53,
	0x50, 0x4f, 0x4e, 0x53, 0x49, 0x56, 0x45, 0x5f, 0x41, 0x44, 0x10, 0x1e, 0x42, 0xe0, 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, 0x0b, 0x41, 0x64, 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_ad_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_ad_type_proto_rawDescData = file_google_ads_googleads_v3_enums_ad_type_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_ad_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_ad_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_ad_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_ad_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_ad_type_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_ad_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_ad_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_ad_type_proto_goTypes = []interface{}{
	(AdTypeEnum_AdType)(0), // 0: google.ads.googleads.v3.enums.AdTypeEnum.AdType
	(*AdTypeEnum)(nil),     // 1: google.ads.googleads.v3.enums.AdTypeEnum
}
var file_google_ads_googleads_v3_enums_ad_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_ad_type_proto_init() }
func file_google_ads_googleads_v3_enums_ad_type_proto_init() {
	if File_google_ads_googleads_v3_enums_ad_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_ad_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AdTypeEnum); 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_ad_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_ad_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_ad_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_ad_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_ad_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_ad_type_proto = out.File
	file_google_ads_googleads_v3_enums_ad_type_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_ad_type_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_ad_type_proto_depIdxs = nil
}
