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

// Goal of TargetCpaOptIn recommendation.
type TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal int32

const (
	// Not specified.
	TargetCpaOptInRecommendationGoalEnum_UNSPECIFIED TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 0
	// Used for return value only. Represents value unknown in this version.
	TargetCpaOptInRecommendationGoalEnum_UNKNOWN TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 1
	// Recommendation to set Target CPA to maintain the same cost.
	TargetCpaOptInRecommendationGoalEnum_SAME_COST TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 2
	// Recommendation to set Target CPA to maintain the same conversions.
	TargetCpaOptInRecommendationGoalEnum_SAME_CONVERSIONS TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 3
	// Recommendation to set Target CPA to maintain the same CPA.
	TargetCpaOptInRecommendationGoalEnum_SAME_CPA TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 4
	// Recommendation to set Target CPA to a value that is as close as possible
	// to, yet lower than, the actual CPA (computed for past 28 days).
	TargetCpaOptInRecommendationGoalEnum_CLOSEST_CPA TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal = 5
)

var TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "SAME_COST",
	3: "SAME_CONVERSIONS",
	4: "SAME_CPA",
	5: "CLOSEST_CPA",
}

var TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_value = map[string]int32{
	"UNSPECIFIED":      0,
	"UNKNOWN":          1,
	"SAME_COST":        2,
	"SAME_CONVERSIONS": 3,
	"SAME_CPA":         4,
	"CLOSEST_CPA":      5,
}

func (x TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) String() string {
	return proto.EnumName(TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name, int32(x))
}

func (TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_b31eca895470b68a, []int{0, 0}
}

// Container for enum describing goals for TargetCpaOptIn recommendation.
type TargetCpaOptInRecommendationGoalEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TargetCpaOptInRecommendationGoalEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal", TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name, TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_value)
	proto.RegisterType((*TargetCpaOptInRecommendationGoalEnum)(nil), "google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum")
}

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

var fileDescriptor_b31eca895470b68a = []byte{
	// 358 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0xcb, 0x4a, 0xeb, 0x40,
	0x18, 0xc7, 0x4f, 0xd2, 0x73, 0x8e, 0x3a, 0x55, 0x0c, 0xc1, 0x95, 0x58, 0xb0, 0x45, 0xb7, 0x93,
	0x45, 0x76, 0xe3, 0x2a, 0x8d, 0xb1, 0x04, 0x35, 0x09, 0x4d, 0x1b, 0x41, 0x02, 0x61, 0x6c, 0xc2,
	0x10, 0x48, 0x66, 0x42, 0x66, 0xda, 0x27, 0xf0, 0x49, 0x5c, 0x0a, 0xbe, 0x88, 0x8f, 0xe2, 0x23,
	0xb8, 0x92, 0xcc, 0xb4, 0x05, 0x17, 0xda, 0xcd, 0xf0, 0x9f, 0xef, 0xf2, 0xfb, 0x6e, 0xc0, 0x27,
	0x8c, 0x91, 0xaa, 0xb0, 0x70, 0xce, 0x2d, 0x25, 0x3b, 0xb5, 0xb2, 0xad, 0x82, 0x2e, 0x6b, 0x6e,
	0x09, 0xdc, 0x92, 0x42, 0x64, 0x8b, 0x06, 0x67, 0xac, 0x11, 0x59, 0x49, 0xb3, 0xb6, 0x58, 0xb0,
	0xba, 0x2e, 0x68, 0x8e, 0x45, 0xc9, 0x68, 0x46, 0x18, 0xae, 0x60, 0xd3, 0x32, 0xc1, 0xcc, 0x81,
	0xca, 0x87, 0x38, 0xe7, 0x70, 0x8b, 0x82, 0x2b, 0x1b, 0x4a, 0xd4, 0xe9, 0xd9, 0xa6, 0x52, 0x53,
	0x5a, 0x98, 0x52, 0x26, 0x24, 0x80, 0xab, 0xe4, 0xd1, 0x9b, 0x06, 0x2e, 0x66, 0xb2, 0x98, 0xdb,
	0xe0, 0xb0, 0x11, 0x3e, 0x9d, 0x7e, 0x2b, 0x34, 0x61, 0xb8, 0xf2, 0xe8, 0xb2, 0x1e, 0x3d, 0x6b,
	0xe0, 0x7c, 0x57, 0xa0, 0x79, 0x0c, 0xfa, 0xf3, 0x20, 0x8e, 0x3c, 0xd7, 0xbf, 0xf1, 0xbd, 0x6b,
	0xe3, 0x8f, 0xd9, 0x07, 0x7b, 0xf3, 0xe0, 0x36, 0x08, 0x1f, 0x02, 0x43, 0x33, 0x8f, 0xc0, 0x41,
	0xec, 0xdc, 0x7b, 0x99, 0x1b, 0xc6, 0x33, 0x43, 0x37, 0x4f, 0x80, 0xb1, 0xfe, 0x06, 0x89, 0x37,
	0x8d, 0xfd, 0x30, 0x88, 0x8d, 0x9e, 0x79, 0x08, 0xf6, 0x95, 0x35, 0x72, 0x8c, 0xbf, 0x1d, 0xd0,
	0xbd, 0x0b, 0x63, 0x2f, 0x9e, 0x49, 0xc3, 0xbf, 0xf1, 0xa7, 0x06, 0x86, 0x0b, 0x56, 0xc3, 0x5f,
	0x67, 0x1e, 0x5f, 0xee, 0xea, 0x34, 0xea, 0x86, 0x8f, 0xb4, 0xc7, 0xf1, 0x9a, 0x43, 0x58, 0x85,
	0x29, 0x81, 0xac, 0x25, 0x16, 0x29, 0xa8, 0x5c, 0xcd, 0xe6, 0x2c, 0x4d, 0xc9, 0x7f, 0xb8, 0xd2,
	0x95, 0x7c, 0x5f, 0xf4, 0xde, 0xc4, 0x71, 0x5e, 0xf5, 0xc1, 0x44, 0xa1, 0x9c, 0x9c, 0x43, 0x25,
	0x3b, 0x95, 0xd8, 0xb0, 0x5b, 0x1f, 0x7f, 0xdf, 0xf8, 0x53, 0x27, 0xe7, 0xe9, 0xd6, 0x9f, 0x26,
	0x76, 0x2a, 0xfd, 0x1f, 0xfa, 0x50, 0x19, 0x11, 0x72, 0x72, 0x8e, 0xd0, 0x36, 0x02, 0xa1, 0xc4,
	0x46, 0x48, 0xc6, 0x3c, 0xfd, 0x97, 0x8d, 0xd9, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdf, 0x49,
	0x6a, 0x72, 0x3d, 0x02, 0x00, 0x00,
}
