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

const (
	// Not specified.
	BudgetPeriodEnum_UNSPECIFIED BudgetPeriodEnum_BudgetPeriod = 0
	// Used for return value only. Represents value unknown in this version.
	BudgetPeriodEnum_UNKNOWN BudgetPeriodEnum_BudgetPeriod = 1
	// Daily budget.
	BudgetPeriodEnum_DAILY BudgetPeriodEnum_BudgetPeriod = 2
)

var BudgetPeriodEnum_BudgetPeriod_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "DAILY",
}

var BudgetPeriodEnum_BudgetPeriod_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"DAILY":       2,
}

func (x BudgetPeriodEnum_BudgetPeriod) String() string {
	return proto.EnumName(BudgetPeriodEnum_BudgetPeriod_name, int32(x))
}

func (BudgetPeriodEnum_BudgetPeriod) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_81ebdaeddf717b90, []int{0, 0}
}

// Message describing Budget period.
type BudgetPeriodEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BudgetPeriodEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.BudgetPeriodEnum_BudgetPeriod", BudgetPeriodEnum_BudgetPeriod_name, BudgetPeriodEnum_BudgetPeriod_value)
	proto.RegisterType((*BudgetPeriodEnum)(nil), "google.ads.googleads.v3.enums.BudgetPeriodEnum")
}

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

var fileDescriptor_81ebdaeddf717b90 = []byte{
	// 288 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x4c, 0xcf, 0xcf, 0x4f,
	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x63, 0xfd, 0xd4, 0xbc,
	0xd2, 0xdc, 0x62, 0xfd, 0xa4, 0xd2, 0x94, 0xf4, 0xd4, 0x92, 0xf8, 0x82, 0xd4, 0xa2, 0xcc, 0xfc,
	0x14, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x59, 0x88, 0x3a, 0xbd, 0xc4, 0x94, 0x62, 0x3d,
	0xb8, 0x16, 0xbd, 0x32, 0x63, 0x3d, 0xb0, 0x16, 0x29, 0x19, 0x98, 0x89, 0x05, 0x99, 0xfa, 0x89,
	0x79, 0x79, 0xf9, 0x25, 0x89, 0x25, 0x99, 0xf9, 0x79, 0xc5, 0x10, 0xcd, 0x4a, 0xde, 0x5c, 0x02,
	0x4e, 0x60, 0x33, 0x03, 0xc0, 0x46, 0xba, 0xe6, 0x95, 0xe6, 0x2a, 0x99, 0x73, 0xf1, 0x20, 0x8b,
	0x09, 0xf1, 0x73, 0x71, 0x87, 0xfa, 0x05, 0x07, 0xb8, 0x3a, 0x7b, 0xba, 0x79, 0xba, 0xba, 0x08,
	0x30, 0x08, 0x71, 0x73, 0xb1, 0x87, 0xfa, 0x79, 0xfb, 0xf9, 0x87, 0xfb, 0x09, 0x30, 0x0a, 0x71,
	0x72, 0xb1, 0xba, 0x38, 0x7a, 0xfa, 0x44, 0x0a, 0x30, 0x39, 0x3d, 0x63, 0xe4, 0x52, 0x4c, 0xce,
	0xcf, 0xd5, 0xc3, 0xeb, 0x20, 0x27, 0x41, 0x64, 0xc3, 0x03, 0x40, 0xae, 0x08, 0x60, 0x8c, 0x72,
	0x82, 0xea, 0x49, 0xcf, 0xcf, 0x49, 0xcc, 0x4b, 0xd7, 0xcb, 0x2f, 0x4a, 0xd7, 0x4f, 0x4f, 0xcd,
	0x03, 0xbb, 0x11, 0x16, 0x0e, 0x05, 0x99, 0xc5, 0x38, 0x82, 0xc5, 0x1a, 0x4c, 0x2e, 0x62, 0x62,
	0x76, 0x77, 0x74, 0x5c, 0xc5, 0x24, 0xeb, 0x0e, 0x31, 0xca, 0x31, 0xa5, 0x58, 0x0f, 0xc2, 0x04,
	0xb1, 0xc2, 0x8c, 0xf5, 0x40, 0x9e, 0x2b, 0x3e, 0x05, 0x93, 0x8f, 0x71, 0x4c, 0x29, 0x8e, 0x81,
	0xcb, 0xc7, 0x84, 0x19, 0xc7, 0x80, 0xe5, 0x5f, 0x31, 0x29, 0x42, 0x04, 0xad, 0xac, 0x1c, 0x53,
	0x8a, 0xad, 0xac, 0xe0, 0x2a, 0xac, 0xac, 0xc2, 0x8c, 0xad, 0xac, 0xc0, 0x6a, 0x92, 0xd8, 0xc0,
	0x0e, 0x33, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x51, 0xdb, 0x23, 0x98, 0xae, 0x01, 0x00, 0x00,
}
