// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/budget_delivery_method.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 delivery methods of a Budget.
type BudgetDeliveryMethodEnum_BudgetDeliveryMethod int32

const (
	// Not specified.
	BudgetDeliveryMethodEnum_UNSPECIFIED BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 0
	// Used for return value only. Represents value unknown in this version.
	BudgetDeliveryMethodEnum_UNKNOWN BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 1
	// The budget server will throttle serving evenly across
	// the entire time period.
	BudgetDeliveryMethodEnum_STANDARD BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 2
	// The budget server will not throttle serving,
	// and ads will serve as fast as possible.
	BudgetDeliveryMethodEnum_ACCELERATED BudgetDeliveryMethodEnum_BudgetDeliveryMethod = 3
)

var BudgetDeliveryMethodEnum_BudgetDeliveryMethod_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "STANDARD",
	3: "ACCELERATED",
}

var BudgetDeliveryMethodEnum_BudgetDeliveryMethod_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"STANDARD":    2,
	"ACCELERATED": 3,
}

func (x BudgetDeliveryMethodEnum_BudgetDeliveryMethod) String() string {
	return proto.EnumName(BudgetDeliveryMethodEnum_BudgetDeliveryMethod_name, int32(x))
}

func (BudgetDeliveryMethodEnum_BudgetDeliveryMethod) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_addd9b866c9590d5, []int{0, 0}
}

// Message describing Budget delivery methods. A delivery method determines the
// rate at which the Budget is spent.
type BudgetDeliveryMethodEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BudgetDeliveryMethodEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetDeliveryMethodEnum_BudgetDeliveryMethod", BudgetDeliveryMethodEnum_BudgetDeliveryMethod_name, BudgetDeliveryMethodEnum_BudgetDeliveryMethod_value)
	proto.RegisterType((*BudgetDeliveryMethodEnum)(nil), "google.ads.googleads.v3.enums.BudgetDeliveryMethodEnum")
}

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

var fileDescriptor_addd9b866c9590d5 = []byte{
	// 311 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xcd, 0x4a, 0xc3, 0x30,
	0x00, 0x76, 0x1d, 0xa8, 0x64, 0x82, 0xa5, 0x78, 0x50, 0x71, 0x87, 0xed, 0x01, 0x92, 0x43, 0x6e,
	0xf1, 0x94, 0xae, 0x71, 0x0c, 0xb5, 0x8e, 0xfd, 0x09, 0x52, 0x18, 0x9d, 0x09, 0xb1, 0xb0, 0x26,
	0x63, 0xe9, 0x0a, 0xbe, 0x8e, 0x47, 0x1f, 0xc5, 0x47, 0xf1, 0xe0, 0x33, 0x48, 0x93, 0xb5, 0xa7,
	0xe9, 0x25, 0x7c, 0xe4, 0xfb, 0xc9, 0x97, 0x0f, 0x10, 0xa9, 0xb5, 0x5c, 0x0b, 0x94, 0x72, 0x83,
	0x1c, 0xac, 0x50, 0x89, 0x91, 0x50, 0xbb, 0xdc, 0xa0, 0xd5, 0x8e, 0x4b, 0x51, 0x2c, 0xb9, 0x58,
	0x67, 0xa5, 0xd8, 0xbe, 0x2f, 0x73, 0x51, 0xbc, 0x69, 0x0e, 0x37, 0x5b, 0x5d, 0xe8, 0xa0, 0xeb,
	0x0c, 0x30, 0xe5, 0x06, 0x36, 0x5e, 0x58, 0x62, 0x68, 0xbd, 0xd7, 0x37, 0x75, 0xf4, 0x26, 0x43,
	0xa9, 0x52, 0xba, 0x48, 0x8b, 0x4c, 0x2b, 0xe3, 0xcc, 0x7d, 0x0d, 0x2e, 0x43, 0x1b, 0x1e, 0xed,
	0xb3, 0x1f, 0x6d, 0x34, 0x53, 0xbb, 0xbc, 0x3f, 0x05, 0x17, 0x87, 0xb8, 0xe0, 0x1c, 0x74, 0xe6,
	0xf1, 0x74, 0xcc, 0x06, 0xa3, 0xbb, 0x11, 0x8b, 0xfc, 0xa3, 0xa0, 0x03, 0x4e, 0xe6, 0xf1, 0x7d,
	0xfc, 0xf4, 0x1c, 0xfb, 0xad, 0xe0, 0x0c, 0x9c, 0x4e, 0x67, 0x34, 0x8e, 0xe8, 0x24, 0xf2, 0xbd,
	0x4a, 0x4b, 0x07, 0x03, 0xf6, 0xc0, 0x26, 0x74, 0xc6, 0x22, 0xbf, 0x1d, 0xfe, 0xb4, 0x40, 0xef,
	0x55, 0xe7, 0xf0, 0xdf, 0xd2, 0xe1, 0xd5, 0xa1, 0x87, 0xc7, 0x55, 0xe3, 0x71, 0xeb, 0x25, 0xdc,
	0x7b, 0xa5, 0x5e, 0xa7, 0x4a, 0x42, 0xbd, 0x95, 0x48, 0x0a, 0x65, 0xff, 0x53, 0x8f, 0xb7, 0xc9,
	0xcc, 0x1f, 0x5b, 0xde, 0xda, 0xf3, 0xc3, 0x6b, 0x0f, 0x29, 0xfd, 0xf4, 0xba, 0x43, 0x17, 0x45,
	0xb9, 0x81, 0x0e, 0x56, 0x68, 0x81, 0x61, 0x35, 0x80, 0xf9, 0xaa, 0xf9, 0x84, 0x72, 0x93, 0x34,
	0x7c, 0xb2, 0xc0, 0x89, 0xe5, 0xbf, 0xbd, 0x9e, 0xbb, 0x24, 0x84, 0x72, 0x43, 0x48, 0xa3, 0x20,
	0x64, 0x81, 0x09, 0xb1, 0x9a, 0xd5, 0xb1, 0x2d, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xdb,
	0xc1, 0xca, 0xdd, 0xe3, 0x01, 0x00, 0x00,
}
