// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/account_budget_proposal_type.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// 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
)

var AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CREATE",
	3: "UPDATE",
	4: "END",
	5: "REMOVE",
}

var AccountBudgetProposalTypeEnum_AccountBudgetProposalType_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"CREATE":      2,
	"UPDATE":      3,
	"END":         4,
	"REMOVE":      5,
}

func (x AccountBudgetProposalTypeEnum_AccountBudgetProposalType) String() string {
	return proto.EnumName(AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name, int32(x))
}

func (AccountBudgetProposalTypeEnum_AccountBudgetProposalType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_23d72264051de41b, []int{0, 0}
}

// Message describing AccountBudgetProposal types.
type AccountBudgetProposalTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *AccountBudgetProposalTypeEnum) Reset()         { *m = AccountBudgetProposalTypeEnum{} }
func (m *AccountBudgetProposalTypeEnum) String() string { return proto.CompactTextString(m) }
func (*AccountBudgetProposalTypeEnum) ProtoMessage()    {}
func (*AccountBudgetProposalTypeEnum) Descriptor() ([]byte, []int) {
	return fileDescriptor_23d72264051de41b, []int{0}
}

func (m *AccountBudgetProposalTypeEnum) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AccountBudgetProposalTypeEnum.Unmarshal(m, b)
}
func (m *AccountBudgetProposalTypeEnum) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AccountBudgetProposalTypeEnum.Marshal(b, m, deterministic)
}
func (m *AccountBudgetProposalTypeEnum) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AccountBudgetProposalTypeEnum.Merge(m, src)
}
func (m *AccountBudgetProposalTypeEnum) XXX_Size() int {
	return xxx_messageInfo_AccountBudgetProposalTypeEnum.Size(m)
}
func (m *AccountBudgetProposalTypeEnum) XXX_DiscardUnknown() {
	xxx_messageInfo_AccountBudgetProposalTypeEnum.DiscardUnknown(m)
}

var xxx_messageInfo_AccountBudgetProposalTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AccountBudgetProposalTypeEnum_AccountBudgetProposalType", AccountBudgetProposalTypeEnum_AccountBudgetProposalType_name, AccountBudgetProposalTypeEnum_AccountBudgetProposalType_value)
	proto.RegisterType((*AccountBudgetProposalTypeEnum)(nil), "google.ads.googleads.v3.enums.AccountBudgetProposalTypeEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/account_budget_proposal_type.proto", fileDescriptor_23d72264051de41b)
}

var fileDescriptor_23d72264051de41b = []byte{
	// 334 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x41, 0x6a, 0x3a, 0x31,
	0x14, 0xc6, 0xff, 0x33, 0xfe, 0xab, 0x10, 0x17, 0x1d, 0x66, 0xd7, 0x52, 0x0b, 0x7a, 0x80, 0xcc,
	0x62, 0x76, 0xe9, 0xa6, 0x19, 0x4d, 0x45, 0x4a, 0xc7, 0xc1, 0xea, 0x14, 0xca, 0x80, 0x44, 0x67,
	0x1a, 0x04, 0x4d, 0x82, 0xc9, 0x08, 0x9e, 0xa0, 0xf7, 0xe8, 0xb2, 0x47, 0xe9, 0x51, 0xba, 0xed,
	0x05, 0x4a, 0x12, 0x75, 0x67, 0x37, 0xe1, 0x47, 0xde, 0x7b, 0xdf, 0xf7, 0xde, 0x07, 0xee, 0x99,
	0x10, 0x6c, 0x5d, 0x45, 0xb4, 0x54, 0x91, 0x43, 0x43, 0xbb, 0x38, 0xaa, 0x78, 0xbd, 0x51, 0x11,
	0x5d, 0x2e, 0x45, 0xcd, 0xf5, 0x7c, 0x51, 0x97, 0xac, 0xd2, 0x73, 0xb9, 0x15, 0x52, 0x28, 0xba,
	0x9e, 0xeb, 0xbd, 0xac, 0xa0, 0xdc, 0x0a, 0x2d, 0xc2, 0x8e, 0x1b, 0x83, 0xb4, 0x54, 0xf0, 0xa4,
	0x00, 0x77, 0x31, 0xb4, 0x0a, 0xd7, 0x37, 0x47, 0x03, 0xb9, 0x8a, 0x28, 0xe7, 0x42, 0x53, 0xbd,
	0x12, 0x5c, 0xb9, 0xe1, 0xde, 0xbb, 0x07, 0x3a, 0xd8, 0x79, 0x24, 0xd6, 0x22, 0x3b, 0x38, 0x4c,
	0xf7, 0xb2, 0x22, 0xbc, 0xde, 0xf4, 0xde, 0xc0, 0xd5, 0xd9, 0x86, 0xf0, 0x12, 0xb4, 0x67, 0xe9,
	0x73, 0x46, 0xfa, 0xa3, 0x87, 0x11, 0x19, 0x04, 0xff, 0xc2, 0x36, 0x68, 0xcd, 0xd2, 0xc7, 0x74,
	0xfc, 0x92, 0x06, 0x5e, 0x08, 0x40, 0xb3, 0x3f, 0x21, 0x78, 0x4a, 0x02, 0xdf, 0xf0, 0x2c, 0x1b,
	0x18, 0x6e, 0x84, 0x2d, 0xd0, 0x20, 0xe9, 0x20, 0xf8, 0x6f, 0x3e, 0x27, 0xe4, 0x69, 0x9c, 0x93,
	0xe0, 0x22, 0xf9, 0xf1, 0x40, 0x77, 0x29, 0x36, 0xf0, 0xcf, 0x6b, 0x92, 0xdb, 0xb3, 0xbb, 0x64,
	0xe6, 0x9e, 0xcc, 0x7b, 0x4d, 0x0e, 0x02, 0x4c, 0xac, 0x29, 0x67, 0x50, 0x6c, 0x59, 0xc4, 0x2a,
	0x6e, 0xaf, 0x3d, 0x06, 0x2c, 0x57, 0xea, 0x4c, 0xde, 0x77, 0xf6, 0xfd, 0xf0, 0x1b, 0x43, 0x8c,
	0x3f, 0xfd, 0xce, 0xd0, 0x49, 0xe1, 0x52, 0x41, 0x87, 0x86, 0xf2, 0x18, 0x9a, 0x60, 0xd4, 0xd7,
	0xb1, 0x5e, 0xe0, 0x52, 0x15, 0xa7, 0x7a, 0x91, 0xc7, 0x85, 0xad, 0x7f, 0xfb, 0x5d, 0xf7, 0x89,
	0x10, 0x2e, 0x15, 0x42, 0xa7, 0x0e, 0x84, 0xf2, 0x18, 0x21, 0xdb, 0xb3, 0x68, 0xda, 0xc5, 0xe2,
	0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x56, 0xef, 0x9a, 0xc5, 0x07, 0x02, 0x00, 0x00,
}
