// 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/v1/enums/advertising_channel_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

// Enum describing the various advertising channel types.
type AdvertisingChannelTypeEnum_AdvertisingChannelType int32

const (
	// Not specified.
	AdvertisingChannelTypeEnum_UNSPECIFIED AdvertisingChannelTypeEnum_AdvertisingChannelType = 0
	// Used for return value only. Represents value unknown in this version.
	AdvertisingChannelTypeEnum_UNKNOWN AdvertisingChannelTypeEnum_AdvertisingChannelType = 1
	// Search Network. Includes display bundled, and Search+ campaigns.
	AdvertisingChannelTypeEnum_SEARCH AdvertisingChannelTypeEnum_AdvertisingChannelType = 2
	// Google Display Network only.
	AdvertisingChannelTypeEnum_DISPLAY AdvertisingChannelTypeEnum_AdvertisingChannelType = 3
	// Shopping campaigns serve on the shopping property
	// and on google.com search results.
	AdvertisingChannelTypeEnum_SHOPPING AdvertisingChannelTypeEnum_AdvertisingChannelType = 4
	// Hotel Ads campaigns.
	AdvertisingChannelTypeEnum_HOTEL AdvertisingChannelTypeEnum_AdvertisingChannelType = 5
	// Video campaigns.
	AdvertisingChannelTypeEnum_VIDEO AdvertisingChannelTypeEnum_AdvertisingChannelType = 6
	// App Campaigns, and App Campaigns for Engagement, that run
	// across multiple channels.
	AdvertisingChannelTypeEnum_MULTI_CHANNEL AdvertisingChannelTypeEnum_AdvertisingChannelType = 7
)

// Enum value maps for AdvertisingChannelTypeEnum_AdvertisingChannelType.
var (
	AdvertisingChannelTypeEnum_AdvertisingChannelType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "SEARCH",
		3: "DISPLAY",
		4: "SHOPPING",
		5: "HOTEL",
		6: "VIDEO",
		7: "MULTI_CHANNEL",
	}
	AdvertisingChannelTypeEnum_AdvertisingChannelType_value = map[string]int32{
		"UNSPECIFIED":   0,
		"UNKNOWN":       1,
		"SEARCH":        2,
		"DISPLAY":       3,
		"SHOPPING":      4,
		"HOTEL":         5,
		"VIDEO":         6,
		"MULTI_CHANNEL": 7,
	}
)

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

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

func (AdvertisingChannelTypeEnum_AdvertisingChannelType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_advertising_channel_type_proto_enumTypes[0].Descriptor()
}

func (AdvertisingChannelTypeEnum_AdvertisingChannelType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_advertising_channel_type_proto_enumTypes[0]
}

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

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

// The channel type a campaign may target to serve on.
type AdvertisingChannelTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*AdvertisingChannelTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_advertising_channel_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDesc = []byte{
	0x0a, 0x3c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x61, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e,
	0x6e, 0x65, 0x6c, 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, 0x31, 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, 0xa5, 0x01, 0x0a, 0x1a,
	0x41, 0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x6e,
	0x65, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x86, 0x01, 0x0a, 0x16, 0x41,
	0x64, 0x76, 0x65, 0x72, 0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65,
	0x6c, 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, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x41, 0x52, 0x43, 0x48, 0x10, 0x02, 0x12,
	0x0b, 0x0a, 0x07, 0x44, 0x49, 0x53, 0x50, 0x4c, 0x41, 0x59, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08,
	0x53, 0x48, 0x4f, 0x50, 0x50, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x4f,
	0x54, 0x45, 0x4c, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x56, 0x49, 0x44, 0x45, 0x4f, 0x10, 0x06,
	0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45,
	0x4c, 0x10, 0x07, 0x42, 0xf0, 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, 0x31, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x1b, 0x41, 0x64, 0x76, 0x65, 0x72,
	0x74, 0x69, 0x73, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 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, 0x31,
	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, 0x31, 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, 0x31, 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, 0x31, 0x3a,
	0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescData = file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_advertising_channel_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_advertising_channel_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_advertising_channel_type_proto_goTypes = []interface{}{
	(AdvertisingChannelTypeEnum_AdvertisingChannelType)(0), // 0: google.ads.googleads.v1.enums.AdvertisingChannelTypeEnum.AdvertisingChannelType
	(*AdvertisingChannelTypeEnum)(nil),                     // 1: google.ads.googleads.v1.enums.AdvertisingChannelTypeEnum
}
var file_google_ads_googleads_v1_enums_advertising_channel_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_v1_enums_advertising_channel_type_proto_init() }
func file_google_ads_googleads_v1_enums_advertising_channel_type_proto_init() {
	if File_google_ads_googleads_v1_enums_advertising_channel_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_advertising_channel_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AdvertisingChannelTypeEnum); 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_v1_enums_advertising_channel_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_advertising_channel_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_advertising_channel_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_advertising_channel_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_advertising_channel_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_advertising_channel_type_proto = out.File
	file_google_ads_googleads_v1_enums_advertising_channel_type_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_advertising_channel_type_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_advertising_channel_type_proto_depIdxs = nil
}
