// 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/v2/enums/product_type_level.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 level of the type of a product offer.
type ProductTypeLevelEnum_ProductTypeLevel int32

const (
	// Not specified.
	ProductTypeLevelEnum_UNSPECIFIED ProductTypeLevelEnum_ProductTypeLevel = 0
	// Used for return value only. Represents value unknown in this version.
	ProductTypeLevelEnum_UNKNOWN ProductTypeLevelEnum_ProductTypeLevel = 1
	// Level 1.
	ProductTypeLevelEnum_LEVEL1 ProductTypeLevelEnum_ProductTypeLevel = 7
	// Level 2.
	ProductTypeLevelEnum_LEVEL2 ProductTypeLevelEnum_ProductTypeLevel = 8
	// Level 3.
	ProductTypeLevelEnum_LEVEL3 ProductTypeLevelEnum_ProductTypeLevel = 9
	// Level 4.
	ProductTypeLevelEnum_LEVEL4 ProductTypeLevelEnum_ProductTypeLevel = 10
	// Level 5.
	ProductTypeLevelEnum_LEVEL5 ProductTypeLevelEnum_ProductTypeLevel = 11
)

// Enum value maps for ProductTypeLevelEnum_ProductTypeLevel.
var (
	ProductTypeLevelEnum_ProductTypeLevel_name = map[int32]string{
		0:  "UNSPECIFIED",
		1:  "UNKNOWN",
		7:  "LEVEL1",
		8:  "LEVEL2",
		9:  "LEVEL3",
		10: "LEVEL4",
		11: "LEVEL5",
	}
	ProductTypeLevelEnum_ProductTypeLevel_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"LEVEL1":      7,
		"LEVEL2":      8,
		"LEVEL3":      9,
		"LEVEL4":      10,
		"LEVEL5":      11,
	}
)

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

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

func (ProductTypeLevelEnum_ProductTypeLevel) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_product_type_level_proto_enumTypes[0].Descriptor()
}

func (ProductTypeLevelEnum_ProductTypeLevel) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_product_type_level_proto_enumTypes[0]
}

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

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

// Level of the type of a product offer.
type ProductTypeLevelEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*ProductTypeLevelEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_product_type_level_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_product_type_level_proto_rawDesc = []byte{
	0x0a, 0x36, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6c, 0x65, 0x76,
	0x65, 0x6c, 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,
	0x32, 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, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63,
	0x74, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0x6c,
	0x0a, 0x10, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c, 0x65, 0x76,
	0x65, 0x6c, 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, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x31, 0x10, 0x07, 0x12, 0x0a, 0x0a, 0x06,
	0x4c, 0x45, 0x56, 0x45, 0x4c, 0x32, 0x10, 0x08, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45,
	0x4c, 0x33, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x34, 0x10, 0x0a,
	0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x35, 0x10, 0x0b, 0x42, 0xea, 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, 0x32, 0x2e, 0x65, 0x6e, 0x75,
	0x6d, 0x73, 0x42, 0x15, 0x50, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x54, 0x79, 0x70, 0x65, 0x4c,
	0x65, 0x76, 0x65, 0x6c, 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, 0x32, 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, 0x32, 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, 0x32, 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, 0x32, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x33,
}

var (
	file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescData = file_google_ads_googleads_v2_enums_product_type_level_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_product_type_level_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_product_type_level_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_product_type_level_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_product_type_level_proto_goTypes = []interface{}{
	(ProductTypeLevelEnum_ProductTypeLevel)(0), // 0: google.ads.googleads.v2.enums.ProductTypeLevelEnum.ProductTypeLevel
	(*ProductTypeLevelEnum)(nil),               // 1: google.ads.googleads.v2.enums.ProductTypeLevelEnum
}
var file_google_ads_googleads_v2_enums_product_type_level_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_v2_enums_product_type_level_proto_init() }
func file_google_ads_googleads_v2_enums_product_type_level_proto_init() {
	if File_google_ads_googleads_v2_enums_product_type_level_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_product_type_level_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ProductTypeLevelEnum); 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_v2_enums_product_type_level_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_product_type_level_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_product_type_level_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_product_type_level_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_product_type_level_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_product_type_level_proto = out.File
	file_google_ads_googleads_v2_enums_product_type_level_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_product_type_level_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_product_type_level_proto_depIdxs = nil
}
