// 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/v2/enums/call_conversion_reporting_state.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

// Possible data types for a call conversion action state.
type CallConversionReportingStateEnum_CallConversionReportingState int32

const (
	// Not specified.
	CallConversionReportingStateEnum_UNSPECIFIED CallConversionReportingStateEnum_CallConversionReportingState = 0
	// Used for return value only. Represents value unknown in this version.
	CallConversionReportingStateEnum_UNKNOWN CallConversionReportingStateEnum_CallConversionReportingState = 1
	// Call conversion action is disabled.
	CallConversionReportingStateEnum_DISABLED CallConversionReportingStateEnum_CallConversionReportingState = 2
	// Call conversion action will use call conversion type set at the
	// account level.
	CallConversionReportingStateEnum_USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION CallConversionReportingStateEnum_CallConversionReportingState = 3
	// Call conversion action will use call conversion type set at the resource
	// (call only ads/call extensions) level.
	CallConversionReportingStateEnum_USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION CallConversionReportingStateEnum_CallConversionReportingState = 4
)

// Enum value maps for CallConversionReportingStateEnum_CallConversionReportingState.
var (
	CallConversionReportingStateEnum_CallConversionReportingState_name = map[int32]string{
		0: "UNSPECIFIED",
		1: "UNKNOWN",
		2: "DISABLED",
		3: "USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION",
		4: "USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION",
	}
	CallConversionReportingStateEnum_CallConversionReportingState_value = map[string]int32{
		"UNSPECIFIED": 0,
		"UNKNOWN":     1,
		"DISABLED":    2,
		"USE_ACCOUNT_LEVEL_CALL_CONVERSION_ACTION":  3,
		"USE_RESOURCE_LEVEL_CALL_CONVERSION_ACTION": 4,
	}
)

func (x CallConversionReportingStateEnum_CallConversionReportingState) Enum() *CallConversionReportingStateEnum_CallConversionReportingState {
	p := new(CallConversionReportingStateEnum_CallConversionReportingState)
	*p = x
	return p
}

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

func (CallConversionReportingStateEnum_CallConversionReportingState) Descriptor() protoreflect.EnumDescriptor {
	return file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_enumTypes[0].Descriptor()
}

func (CallConversionReportingStateEnum_CallConversionReportingState) Type() protoreflect.EnumType {
	return &file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_enumTypes[0]
}

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

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

// Container for enum describing possible data types for call conversion
// reporting state.
type CallConversionReportingStateEnum struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*CallConversionReportingStateEnum) ProtoMessage() {}

func (x *CallConversionReportingStateEnum) ProtoReflect() protoreflect.Message {
	mi := &file_google_ads_googleads_v2_enums_call_conversion_reporting_state_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 CallConversionReportingStateEnum.ProtoReflect.Descriptor instead.
func (*CallConversionReportingStateEnum) Descriptor() ([]byte, []int) {
	return file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescGZIP(), []int{0}
}

var File_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto protoreflect.FileDescriptor

var file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDesc = []byte{
	0x0a, 0x43, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x64, 0x73, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x64, 0x73, 0x2f, 0x76, 0x32, 0x2f, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x2f,
	0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f,
	0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 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, 0x32, 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, 0xcc, 0x01, 0x0a, 0x20, 0x43, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x76, 0x65,
	0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x74,
	0x61, 0x74, 0x65, 0x45, 0x6e, 0x75, 0x6d, 0x22, 0xa7, 0x01, 0x0a, 0x1c, 0x43, 0x61, 0x6c, 0x6c,
	0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74,
	0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x0c, 0x0a, 0x08, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c,
	0x45, 0x44, 0x10, 0x02, 0x12, 0x2c, 0x0a, 0x28, 0x55, 0x53, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x4f,
	0x55, 0x4e, 0x54, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x43,
	0x4f, 0x4e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e,
	0x10, 0x03, 0x12, 0x2d, 0x0a, 0x29, 0x55, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x55, 0x52,
	0x43, 0x45, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x43, 0x4f,
	0x4e, 0x56, 0x45, 0x52, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10,
	0x04, 0x42, 0xf6, 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,
	0x32, 0x2e, 0x65, 0x6e, 0x75, 0x6d, 0x73, 0x42, 0x21, 0x43, 0x61, 0x6c, 0x6c, 0x43, 0x6f, 0x6e,
	0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67,
	0x53, 0x74, 0x61, 0x74, 0x65, 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, 0x32, 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, 0x32,
	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, 0x32,
	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, 0x32, 0x3a, 0x3a, 0x45, 0x6e, 0x75, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x33,
}

var (
	file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescOnce sync.Once
	file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescData = file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDesc
)

func file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescGZIP() []byte {
	file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescOnce.Do(func() {
		file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescData)
	})
	return file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDescData
}

var file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_goTypes = []interface{}{
	(CallConversionReportingStateEnum_CallConversionReportingState)(0), // 0: google.ads.googleads.v2.enums.CallConversionReportingStateEnum.CallConversionReportingState
	(*CallConversionReportingStateEnum)(nil),                           // 1: google.ads.googleads.v2.enums.CallConversionReportingStateEnum
}
var file_google_ads_googleads_v2_enums_call_conversion_reporting_state_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_v2_enums_call_conversion_reporting_state_proto_init() }
func file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_init() {
	if File_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CallConversionReportingStateEnum); 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_v2_enums_call_conversion_reporting_state_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_goTypes,
		DependencyIndexes: file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_depIdxs,
		EnumInfos:         file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_enumTypes,
		MessageInfos:      file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_msgTypes,
	}.Build()
	File_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto = out.File
	file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_rawDesc = nil
	file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_goTypes = nil
	file_google_ads_googleads_v2_enums_call_conversion_reporting_state_proto_depIdxs = nil
}
