// 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/promotion_extension_discount_modifier.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

// A promotion extension discount modifier.
type PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier int32

const (
	// Not specified.
	PromotionExtensionDiscountModifierEnum_UNSPECIFIED PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier = 0
	// Used for return value only. Represents value unknown in this version.
	PromotionExtensionDiscountModifierEnum_UNKNOWN PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier = 1
	// 'Up to'.
	PromotionExtensionDiscountModifierEnum_UP_TO PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier = 2
)

// Enum value maps for PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier.
var (
	PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "UP_TO",
	}
	PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"UP_TO":       2,
	}
)

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

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

func (PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_enumTypes[0].Descriptor()
}

func (PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_enumTypes[0]
}

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

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

// Container for enum describing possible a promotion extension
// discount modifier.
type PromotionExtensionDiscountModifierEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*PromotionExtensionDiscountModifierEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDesc = []byte{
	0x0a, 0x49, 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, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
	0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64,
	0x69, 0x66, 0x69, 0x65, 0x72, 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, 0x77, 0x0a, 0x26, 0x50, 0x72, 0x6f, 0x6d,
	0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69,
	0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 0x45, 0x6e,
	0x75, 0x6d, 0x22, 0x4d, 0x0a, 0x22, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69, 0x6f, 0x6e, 0x45,
	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x75, 0x6e, 0x74,
	0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 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, 0x55, 0x50, 0x5f, 0x54, 0x4f, 0x10,
	0x02, 0x42, 0xfc, 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, 0x27, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x69,
	0x6f, 0x6e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x63, 0x6f,
	0x75, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x72, 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_promotion_extension_discount_modifier_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDescData = file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDesc
)

func file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDescData)
	})
	return file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDescData
}

var file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_goTypes = []interface{}{
	(PromotionExtensionDiscountModifierEnum_PromotionExtensionDiscountModifier)(0), // 0: google.ads.googleads.v1.enums.PromotionExtensionDiscountModifierEnum.PromotionExtensionDiscountModifier
	(*PromotionExtensionDiscountModifierEnum)(nil),                                 // 1: google.ads.googleads.v1.enums.PromotionExtensionDiscountModifierEnum
}
var file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_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_promotion_extension_discount_modifier_proto_init() }
func file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_init() {
	if File_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PromotionExtensionDiscountModifierEnum); 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_promotion_extension_discount_modifier_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto = out.File
	file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_rawDesc = nil
	file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_goTypes = nil
	file_google_ads_googleads_v1_enums_promotion_extension_discount_modifier_proto_depIdxs = nil
}
