// 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/account_budget_proposal_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 AccountBudgetProposal.
type AccountBudgetProposalTypeEnum_AccountBudgetProposalType int32

const (
	// Not specified.
	AccountBudgetProposalTypeEnum_UNSPECIFIED AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 0
	// Used for return value only. Represents value unknown in this version.
	AccountBudgetProposalTypeEnum_UNKNOWN AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 1
	// Identifies a request to create a new budget.
	AccountBudgetProposalTypeEnum_CREATE AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 2
	// Identifies a request to edit an existing budget.
	AccountBudgetProposalTypeEnum_UPDATE AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 3
	// Identifies a request to end a budget that has already started.
	AccountBudgetProposalTypeEnum_END AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 4
	// Identifies a request to remove a budget that hasn't started yet.
	AccountBudgetProposalTypeEnum_REMOVE AccountBudgetProposalTypeEnum_AccountBudgetProposalType = 5
)

// Enum value maps for AccountBudgetProposalTypeEnum_AccountBudgetProposalType.
var (
	AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "CREATE",
		3: "UPDATE",
		4: "END",
		5: "REMOVE",
	}
	AccountBudgetProposalTypeEnum_AccountBudgetProposalType_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"CREATE":      2,
		"UPDATE":      3,
		"END":         4,
		"REMOVE":      5,
	}
)

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

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

func (AccountBudgetProposalTypeEnum_AccountBudgetProposalType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_enumTypes[0].Descriptor()
}

func (AccountBudgetProposalTypeEnum_AccountBudgetProposalType) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_enumTypes[0]
}

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

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

// Message describing AccountBudgetProposal types.
type AccountBudgetProposalTypeEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*AccountBudgetProposalTypeEnum) ProtoMessage() {}

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

var File_google_ads_googleads_v2_enums_account_budget_proposal_type_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDesc = []byte{
	0x0a, 0x40, 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,
	0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x5f, 0x70,
	0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 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, 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,
	0x87, 0x01, 0x0a, 0x1d, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x75, 0x64, 0x67, 0x65,
	0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e, 0x75,
	0x6d, 0x22, 0x66, 0x0a, 0x19, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x75, 0x64, 0x67,
	0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 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,
	0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x55, 0x50, 0x44, 0x41,
	0x54, 0x45, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4e, 0x44, 0x10, 0x04, 0x12, 0x0a, 0x0a,
	0x06, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x05, 0x42, 0xf3, 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,
	0x1e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x50, 0x72,
	0x6f, 0x70, 0x6f, 0x73, 0x61, 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, 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_account_budget_proposal_type_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDescData = file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_goTypes = []interface{}{
	(AccountBudgetProposalTypeEnum_AccountBudgetProposalType)(0), // 0: google.ads.googleads.v2.enums.AccountBudgetProposalTypeEnum.AccountBudgetProposalType
	(*AccountBudgetProposalTypeEnum)(nil),                        // 1: google.ads.googleads.v2.enums.AccountBudgetProposalTypeEnum
}
var file_google_ads_googleads_v2_enums_account_budget_proposal_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_v2_enums_account_budget_proposal_type_proto_init() }
func file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_init() {
	if File_google_ads_googleads_v2_enums_account_budget_proposal_type_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AccountBudgetProposalTypeEnum); 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_account_budget_proposal_type_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_account_budget_proposal_type_proto = out.File
	file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_account_budget_proposal_type_proto_depIdxs = nil
}
