// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/budget_status.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

// Possible statuses of a Budget.
type BudgetStatusEnum_BudgetStatus int32

const (
	// Not specified.
	BudgetStatusEnum_UNSPECIFIED BudgetStatusEnum_BudgetStatus = 0
	// Used for return value only. Represents value unknown in this version.
	BudgetStatusEnum_UNKNOWN BudgetStatusEnum_BudgetStatus = 1
	// Budget is enabled.
	BudgetStatusEnum_ENABLED BudgetStatusEnum_BudgetStatus = 2
	// Budget is removed.
	BudgetStatusEnum_REMOVED BudgetStatusEnum_BudgetStatus = 3
)

var BudgetStatusEnum_BudgetStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ENABLED",
	3: "REMOVED",
}

var BudgetStatusEnum_BudgetStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ENABLED":     2,
	"REMOVED":     3,
}

func (x BudgetStatusEnum_BudgetStatus) String() string {
	return proto.EnumName(BudgetStatusEnum_BudgetStatus_name, int32(x))
}

func (BudgetStatusEnum_BudgetStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_10afd99aeed822db, []int{0, 0}
}

// Message describing a Budget status
type BudgetStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BudgetStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetStatusEnum_BudgetStatus", BudgetStatusEnum_BudgetStatus_name, BudgetStatusEnum_BudgetStatus_value)
	proto.RegisterType((*BudgetStatusEnum)(nil), "google.ads.googleads.v3.enums.BudgetStatusEnum")
}

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

var fileDescriptor_10afd99aeed822db = []byte{
	// 294 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcf, 0x4a, 0xc3, 0x30,
	0x18, 0x77, 0x1d, 0x28, 0x64, 0x82, 0x75, 0x47, 0x71, 0x87, 0xed, 0x01, 0x12, 0x24, 0xb7, 0x78,
	0x4a, 0x5d, 0x36, 0x86, 0xda, 0x15, 0xc7, 0x2a, 0x8c, 0x82, 0x64, 0xa6, 0x84, 0xc2, 0x9a, 0x94,
	0x25, 0xdd, 0x03, 0x79, 0xf4, 0x51, 0x7c, 0x10, 0x0f, 0x3e, 0x85, 0x24, 0x5d, 0xcb, 0x2e, 0x7a,
	0x29, 0xbf, 0xef, 0xfb, 0xfd, 0xe9, 0x2f, 0x1f, 0xb8, 0x93, 0x5a, 0xcb, 0x5d, 0x8e, 0xb8, 0x30,
	0xa8, 0x81, 0x0e, 0x1d, 0x30, 0xca, 0x55, 0x5d, 0x1a, 0xb4, 0xad, 0x85, 0xcc, 0xed, 0x9b, 0xb1,
	0xdc, 0xd6, 0x06, 0x56, 0x7b, 0x6d, 0xf5, 0x70, 0xd4, 0xe8, 0x20, 0x17, 0x06, 0x76, 0x16, 0x78,
	0xc0, 0xd0, 0x5b, 0x6e, 0x6e, 0xdb, 0xc4, 0xaa, 0x40, 0x5c, 0x29, 0x6d, 0xb9, 0x2d, 0xb4, 0x3a,
	0x9a, 0x27, 0x1b, 0x10, 0x46, 0x3e, 0x73, 0xe5, 0x23, 0x99, 0xaa, 0xcb, 0xc9, 0x0c, 0x5c, 0x9e,
	0xee, 0x86, 0x57, 0x60, 0xb0, 0x8e, 0x57, 0x09, 0x7b, 0x58, 0xcc, 0x16, 0x6c, 0x1a, 0x9e, 0x0d,
	0x07, 0xe0, 0x62, 0x1d, 0x3f, 0xc6, 0xcb, 0xd7, 0x38, 0xec, 0xb9, 0x81, 0xc5, 0x34, 0x7a, 0x62,
	0xd3, 0x30, 0x70, 0xc3, 0x0b, 0x7b, 0x5e, 0xa6, 0x6c, 0x1a, 0xf6, 0xa3, 0xef, 0x1e, 0x18, 0xbf,
	0xeb, 0x12, 0xfe, 0xdb, 0x2f, 0xba, 0x3e, 0xfd, 0x57, 0xe2, 0x4a, 0x25, 0xbd, 0x4d, 0x74, 0xf4,
	0x48, 0xbd, 0xe3, 0x4a, 0x42, 0xbd, 0x97, 0x48, 0xe6, 0xca, 0x57, 0x6e, 0xcf, 0x52, 0x15, 0xe6,
	0x8f, 0x2b, 0xdd, 0xfb, 0xef, 0x47, 0xd0, 0x9f, 0x53, 0xfa, 0x19, 0x8c, 0xe6, 0x4d, 0x14, 0x15,
	0x06, 0x36, 0xd0, 0xa1, 0x14, 0x43, 0xf7, 0x56, 0xf3, 0xd5, 0xf2, 0x19, 0x15, 0x26, 0xeb, 0xf8,
	0x2c, 0xc5, 0x99, 0xe7, 0x7f, 0x82, 0x71, 0xb3, 0x24, 0x84, 0x0a, 0x43, 0x48, 0xa7, 0x20, 0x24,
	0xc5, 0x84, 0x78, 0xcd, 0xf6, 0xdc, 0x17, 0xc3, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x1e, 0x77,
	0x42, 0x51, 0xbd, 0x01, 0x00, 0x00,
}
