// Copyright 2020 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/ads/googleads/v3/enums/target_cpa_opt_in_recommendation_goal.proto

package enums

import (
	reflect "reflect"
	sync "sync"

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

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

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

// Enum value maps for TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal.
var (
	TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "SAME_COST",
		3: "SAME_CONVERSIONS",
		4: "SAME_CPA",
		5: "CLOSEST_CPA",
	}
	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) Enum() *TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal {
	p := new(TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal)
	*p = x
	return p
}

func (x TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_enumTypes[0].Descriptor()
}

func (TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_enumTypes[0]
}

func (x TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal.Descriptor instead.
func (TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal) EnumDescriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescGZIP(), []int{0, 0}
}

// Container for enum describing goals for TargetCpaOptIn recommendation.
type TargetCpaOptInRecommendationGoalEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

func (x *TargetCpaOptInRecommendationGoalEnum) Reset() {
	*x = TargetCpaOptInRecommendationGoalEnum{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TargetCpaOptInRecommendationGoalEnum) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TargetCpaOptInRecommendationGoalEnum) ProtoMessage() {}

func (x *TargetCpaOptInRecommendationGoalEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use TargetCpaOptInRecommendationGoalEnum.ProtoReflect.Descriptor instead.
func (*TargetCpaOptInRecommendationGoalEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDesc = []byte{
	0x0a, 0x49, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x70, 0x61, 0x5f, 0x6f, 0x70, 0x74, 0x5f, 0x69,
	0x6e, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x5f, 0x67, 0x6f, 0x61, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64,
	0x73, 0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xad, 0x01, 0x0a, 0x24, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x43, 0x70, 0x61, 0x4f, 0x70, 0x74, 0x49, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x6d,
	0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, 0x61, 0x6c, 0x45, 0x6e, 0x75,
	0x6d, 0x22, 0x84, 0x01, 0x0a, 0x20, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x70, 0x61, 0x4f,
	0x70, 0x74, 0x49, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x47, 0x6f, 0x61, 0x6c, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f,
	0x57, 0x4e, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x4f, 0x53,
	0x54, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x56,
	0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x41, 0x4d,
	0x45, 0x5f, 0x43, 0x50, 0x41, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4c, 0x4f, 0x53, 0x45,
	0x53, 0x54, 0x5f, 0x43, 0x50, 0x41, 0x10, 0x05, 0x42, 0xfa, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x64, 0x73, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x61, 0x64, 0x73, 0x2e, 0x76, 0x33, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x25,
	0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x43, 0x70, 0x61, 0x4f, 0x70, 0x74, 0x49, 0x6e, 0x52, 0x65,
	0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x47, 0x6f, 0x61, 0x6c,
	0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x42, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61,
	0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x33, 0x2f,
	0x65, 0x6e, 0x75, 0x6d, 0x73, 0x3b, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x41,
	0x41, 0xaa, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x41, 0x64, 0x73, 0x2e, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x2e, 0x56, 0x33, 0x2e, 0x45, 0x6e, 0x75, 0x6d,
	0x73, 0xca, 0x02, 0x1d, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x41, 0x64, 0x73, 0x5c, 0x47,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x5c, 0x56, 0x33, 0x5c, 0x45, 0x6e, 0x75, 0x6d,
	0x73, 0xea, 0x02, 0x21, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a, 0x3a, 0x41, 0x64, 0x73, 0x3a,
	0x3a, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x41, 0x64, 0x73, 0x3a, 0x3a, 0x56, 0x33, 0x3a, 0x3a,
	0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescData = file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDesc
)

func file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescData)
	})
	return file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDescData
}

var file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_goTypes = []interface{}{
	(TargetCpaOptInRecommendationGoalEnum_TargetCpaOptInRecommendationGoal)(0), // 0: google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum.TargetCpaOptInRecommendationGoal
	(*TargetCpaOptInRecommendationGoalEnum)(nil),                               // 1: google.ads.googleads.v3.enums.TargetCpaOptInRecommendationGoalEnum
}
var file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_init() }
func file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_init() {
	if File_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TargetCpaOptInRecommendationGoalEnum); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto = out.File
	file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_rawDesc = nil
	file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_goTypes = nil
	file_google_ads_googleads_v3_enums_target_cpa_opt_in_recommendation_goal_proto_depIdxs = nil
}
