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

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",
}

var 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) String() string {
	return proto.EnumName(CallConversionReportingStateEnum_CallConversionReportingState_name, int32(x))
}

func (CallConversionReportingStateEnum_CallConversionReportingState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9c92a91800d0b626, []int{0, 0}
}

// Container for enum describing possible data types for call conversion
// reporting state.
type CallConversionReportingStateEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CallConversionReportingStateEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CallConversionReportingStateEnum_CallConversionReportingState", CallConversionReportingStateEnum_CallConversionReportingState_name, CallConversionReportingStateEnum_CallConversionReportingState_value)
	proto.RegisterType((*CallConversionReportingStateEnum)(nil), "google.ads.googleads.v3.enums.CallConversionReportingStateEnum")
}

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

var fileDescriptor_9c92a91800d0b626 = []byte{
	// 365 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0xca, 0x9c, 0x30,
	0x18, 0xac, 0x6e, 0x69, 0x4b, 0xb6, 0x50, 0xf1, 0x58, 0x76, 0xa1, 0xbb, 0xa7, 0x16, 0xda, 0x78,
	0xf0, 0x96, 0x9e, 0x62, 0x36, 0x5d, 0xa4, 0x12, 0x17, 0x5d, 0x2d, 0x14, 0x21, 0xa4, 0xab, 0x88,
	0xe0, 0x26, 0x62, 0xdc, 0x7d, 0xa0, 0x5e, 0x0a, 0x7d, 0x94, 0xd2, 0x27, 0xe9, 0x03, 0xf4, 0xfc,
	0xa3, 0xfe, 0x7a, 0xfb, 0xbd, 0x84, 0x21, 0x33, 0xdf, 0x4c, 0x32, 0x1f, 0x20, 0xa5, 0x52, 0x65,
	0x5d, 0x38, 0x22, 0xd7, 0xce, 0x08, 0x7b, 0x74, 0x77, 0x9d, 0x42, 0xde, 0xae, 0xda, 0xb9, 0x88,
	0xba, 0xe6, 0x17, 0x25, 0xef, 0x45, 0xab, 0x2b, 0x25, 0x79, 0x5b, 0x34, 0xaa, 0xed, 0x2a, 0x59,
	0x72, 0xdd, 0x89, 0xae, 0x80, 0x4d, 0xab, 0x3a, 0x65, 0x6f, 0xc7, 0x49, 0x28, 0x72, 0x0d, 0x67,
	0x13, 0x78, 0x77, 0xe1, 0x60, 0xf2, 0x76, 0x33, 0x65, 0x34, 0x95, 0x23, 0xa4, 0x54, 0x9d, 0xe8,
	0x2a, 0x25, 0xf5, 0x38, 0xbc, 0xff, 0x6b, 0x80, 0x77, 0x44, 0xd4, 0x35, 0x99, 0x53, 0xa2, 0x29,
	0x24, 0xee, 0x33, 0xa8, 0xbc, 0x5d, 0xf7, 0xbf, 0x0c, 0xb0, 0x59, 0x12, 0xd9, 0x6f, 0xc0, 0x3a,
	0x61, 0xf1, 0x89, 0x12, 0xff, 0x8b, 0x4f, 0x0f, 0xd6, 0x33, 0x7b, 0x0d, 0x5e, 0x26, 0xec, 0x2b,
	0x0b, 0xbf, 0x31, 0xcb, 0xb0, 0x5f, 0x83, 0x57, 0x07, 0x3f, 0xc6, 0x5e, 0x40, 0x0f, 0x96, 0x69,
	0x7f, 0x04, 0xef, 0x93, 0x98, 0x72, 0x4c, 0x48, 0x98, 0xb0, 0x33, 0x0f, 0x68, 0x4a, 0x03, 0x4e,
	0x70, 0x10, 0x70, 0x12, 0xb2, 0x94, 0x46, 0xb1, 0x1f, 0x32, 0x8e, 0xc9, 0xd9, 0x0f, 0x99, 0xb5,
	0xb2, 0x3f, 0x81, 0x0f, 0xbd, 0x3a, 0xa2, 0x71, 0x98, 0x44, 0x84, 0x2e, 0xcb, 0x9f, 0x7b, 0xff,
	0x0d, 0xb0, 0xbb, 0xa8, 0x2b, 0x5c, 0xac, 0xc4, 0xdb, 0x2d, 0x7d, 0xe6, 0xd4, 0xf7, 0x72, 0x32,
	0xbe, 0x7b, 0x8f, 0x1e, 0xa5, 0xaa, 0x85, 0x2c, 0xa1, 0x6a, 0x4b, 0xa7, 0x2c, 0xe4, 0xd0, 0xda,
	0xb4, 0xab, 0xa6, 0xd2, 0x4f, 0xac, 0xee, 0xf3, 0x70, 0xfe, 0x34, 0x57, 0x47, 0x8c, 0x7f, 0x9b,
	0xdb, 0xe3, 0x68, 0x85, 0x73, 0x0d, 0x47, 0xd8, 0xa3, 0xd4, 0x85, 0x7d, 0xbb, 0xfa, 0xcf, 0xc4,
	0x67, 0x38, 0xd7, 0xd9, 0xcc, 0x67, 0xa9, 0x9b, 0x0d, 0xfc, 0x3f, 0x73, 0x37, 0x5e, 0x22, 0x84,
	0x73, 0x8d, 0xd0, 0xac, 0x40, 0x28, 0x75, 0x11, 0x1a, 0x34, 0x3f, 0x5e, 0x0c, 0x0f, 0x73, 0x1f,
	0x02, 0x00, 0x00, 0xff, 0xff, 0x6d, 0x9e, 0x47, 0x5a, 0x52, 0x02, 0x00, 0x00,
}
