// 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/placement_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 placement types for a feed mapping.
type PlacementTypeEnum_PlacementType int32

const (
	// Not specified.
	PlacementTypeEnum_UNSPECIFIED PlacementTypeEnum_PlacementType = 0
	// Used for return value only. Represents value unknown in this version.
	PlacementTypeEnum_UNKNOWN PlacementTypeEnum_PlacementType = 1
	// Websites(e.g. 'www.flowers4sale.com').
	PlacementTypeEnum_WEBSITE PlacementTypeEnum_PlacementType = 2
	// Mobile application categories(e.g. 'Games').
	PlacementTypeEnum_MOBILE_APP_CATEGORY PlacementTypeEnum_PlacementType = 3
	// mobile applications(e.g. 'mobileapp::2-com.whatsthewordanswers').
	PlacementTypeEnum_MOBILE_APPLICATION PlacementTypeEnum_PlacementType = 4
	// YouTube videos(e.g. 'youtube.com/video/wtLJPvx7-ys').
	PlacementTypeEnum_YOUTUBE_VIDEO PlacementTypeEnum_PlacementType = 5
	// YouTube channels(e.g. 'youtube.com::L8ZULXASCc1I_oaOT0NaOQ').
	PlacementTypeEnum_YOUTUBE_CHANNEL PlacementTypeEnum_PlacementType = 6
)

// Enum value maps for PlacementTypeEnum_PlacementType.
var (
	PlacementTypeEnum_PlacementType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "WEBSITE",
		3: "MOBILE_APP_CATEGORY",
		4: "MOBILE_APPLICATION",
		5: "YOUTUBE_VIDEO",
		6: "YOUTUBE_CHANNEL",
	}
	PlacementTypeEnum_PlacementType_value = map[string]int32{
		"UNSPECIFIED":         0,
		"UNKNOWN":             1,
		"WEBSITE":             2,
		"MOBILE_APP_CATEGORY": 3,
		"MOBILE_APPLICATION":  4,
		"YOUTUBE_VIDEO":       5,
		"YOUTUBE_CHANNEL":     6,
	}
)

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

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

func (PlacementTypeEnum_PlacementType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_placement_type_proto_enumTypes[0].Descriptor()
}

func (PlacementTypeEnum_PlacementType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_placement_type_proto_enumTypes[0]
}

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

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

// Container for enum describing possible placement types.
type PlacementTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*PlacementTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_placement_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_placement_type_proto_rawDesc = []byte{
	0x0a, 0x32, 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,
	0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 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, 0xa9, 0x01, 0x0a, 0x11, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54,
	0x79, 0x70, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x93, 0x01, 0x0a, 0x0d, 0x50, 0x6c, 0x61, 0x63,
	0x65, 0x6d, 0x65, 0x6e, 0x74, 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, 0x57, 0x45, 0x42, 0x53, 0x49,
	0x54, 0x45, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x41,
	0x50, 0x50, 0x5f, 0x43, 0x41, 0x54, 0x45, 0x47, 0x4f, 0x52, 0x59, 0x10, 0x03, 0x12, 0x16, 0x0a,
	0x12, 0x4d, 0x4f, 0x42, 0x49, 0x4c, 0x45, 0x5f, 0x41, 0x50, 0x50, 0x4c, 0x49, 0x43, 0x41, 0x54,
	0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x59, 0x4f, 0x55, 0x54, 0x55, 0x42, 0x45,
	0x5f, 0x56, 0x49, 0x44, 0x45, 0x4f, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x59, 0x4f, 0x55, 0x54,
	0x55, 0x42, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x4e, 0x45, 0x4c, 0x10, 0x06, 0x42, 0xe7, 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, 0x12, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 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_placement_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_placement_type_proto_rawDescData = file_google_ads_googleads_v1_enums_placement_type_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_placement_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_placement_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_placement_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_placement_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_placement_type_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_placement_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_placement_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_placement_type_proto_goTypes = []interface{}{
	(PlacementTypeEnum_PlacementType)(0), // 0: google.ads.googleads.v1.enums.PlacementTypeEnum.PlacementType
	(*PlacementTypeEnum)(nil),            // 1: google.ads.googleads.v1.enums.PlacementTypeEnum
}
var file_google_ads_googleads_v1_enums_placement_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_placement_type_proto_init() }
func file_google_ads_googleads_v1_enums_placement_type_proto_init() {
	if File_google_ads_googleads_v1_enums_placement_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_placement_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PlacementTypeEnum); 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_placement_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_placement_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_placement_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_placement_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_placement_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_placement_type_proto = out.File
	file_google_ads_googleads_v1_enums_placement_type_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_placement_type_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_placement_type_proto_depIdxs = nil
}
