// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v2/enums/conversion_action_status.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 statuses of a conversion action.
type ConversionActionStatusEnum_ConversionActionStatus int32

const (
	// Not specified.
	ConversionActionStatusEnum_UNSPECIFIED ConversionActionStatusEnum_ConversionActionStatus = 0
	// Used for return value only. Represents value unknown in this version.
	ConversionActionStatusEnum_UNKNOWN ConversionActionStatusEnum_ConversionActionStatus = 1
	// Conversions will be recorded.
	ConversionActionStatusEnum_ENABLED ConversionActionStatusEnum_ConversionActionStatus = 2
	// Conversions will not be recorded.
	ConversionActionStatusEnum_REMOVED ConversionActionStatusEnum_ConversionActionStatus = 3
	// Conversions will not be recorded and the conversion action will not
	// appear in the UI.
	ConversionActionStatusEnum_HIDDEN ConversionActionStatusEnum_ConversionActionStatus = 4
)

var ConversionActionStatusEnum_ConversionActionStatus_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "ENABLED",
	3: "REMOVED",
	4: "HIDDEN",
}

var ConversionActionStatusEnum_ConversionActionStatus_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"ENABLED":     2,
	"REMOVED":     3,
	"HIDDEN":      4,
}

func (x ConversionActionStatusEnum_ConversionActionStatus) String() string {
	return proto.EnumName(ConversionActionStatusEnum_ConversionActionStatus_name, int32(x))
}

func (ConversionActionStatusEnum_ConversionActionStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_cc35a40cdc214fda, []int{0, 0}
}

// Container for enum describing possible statuses of a conversion action.
type ConversionActionStatusEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ConversionActionStatusEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v2.enums.ConversionActionStatusEnum_ConversionActionStatus", ConversionActionStatusEnum_ConversionActionStatus_name, ConversionActionStatusEnum_ConversionActionStatus_value)
	proto.RegisterType((*ConversionActionStatusEnum)(nil), "google.ads.googleads.v2.enums.ConversionActionStatusEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v2/enums/conversion_action_status.proto", fileDescriptor_cc35a40cdc214fda)
}

var fileDescriptor_cc35a40cdc214fda = []byte{
	// 316 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0xb1, 0x4e, 0xf3, 0x30,
	0x18, 0xfc, 0x9b, 0xfe, 0x2a, 0x92, 0x3b, 0x10, 0x65, 0x60, 0x28, 0x74, 0x68, 0x1f, 0xc0, 0x96,
	0xc2, 0x66, 0x58, 0x9c, 0xc6, 0x94, 0x0a, 0x70, 0x2b, 0xaa, 0x06, 0x09, 0x45, 0x42, 0xa6, 0x89,
	0xac, 0x4a, 0x8d, 0x1d, 0xc5, 0x49, 0x06, 0x1e, 0x87, 0x91, 0x47, 0xe1, 0x51, 0x98, 0x78, 0x04,
	0x64, 0xa7, 0xc9, 0x54, 0x58, 0xec, 0xfb, 0x7c, 0xdf, 0x9d, 0xce, 0x07, 0xae, 0x85, 0x52, 0x62,
	0x9f, 0x22, 0x9e, 0x68, 0xd4, 0x40, 0x83, 0x6a, 0x1f, 0xa5, 0xb2, 0xca, 0x34, 0xda, 0x2a, 0x59,
	0xa7, 0x85, 0xde, 0x29, 0xf9, 0xc2, 0xb7, 0xa5, 0xb9, 0x74, 0xc9, 0xcb, 0x4a, 0xc3, 0xbc, 0x50,
	0xa5, 0xf2, 0xc6, 0x8d, 0x04, 0xf2, 0x44, 0xc3, 0x4e, 0x0d, 0x6b, 0x1f, 0x5a, 0xf5, 0xe8, 0xa2,
	0x35, 0xcf, 0x77, 0x88, 0x4b, 0xa9, 0x4a, 0x6e, 0x2c, 0x0e, 0xe2, 0xe9, 0x1b, 0x18, 0xcd, 0x3a,
	0x7b, 0x62, 0xdd, 0xd7, 0xd6, 0x9c, 0xca, 0x2a, 0x9b, 0xc6, 0xe0, 0xec, 0x38, 0xeb, 0x9d, 0x82,
	0xe1, 0x86, 0xad, 0x57, 0x74, 0xb6, 0xb8, 0x59, 0xd0, 0xd0, 0xfd, 0xe7, 0x0d, 0xc1, 0xc9, 0x86,
	0xdd, 0xb1, 0xe5, 0x13, 0x73, 0x7b, 0x66, 0xa0, 0x8c, 0x04, 0xf7, 0x34, 0x74, 0x1d, 0x33, 0x3c,
	0xd2, 0x87, 0x65, 0x44, 0x43, 0xb7, 0xef, 0x01, 0x30, 0xb8, 0x5d, 0x84, 0x21, 0x65, 0xee, 0xff,
	0xe0, 0xbb, 0x07, 0x26, 0x5b, 0x95, 0xc1, 0x3f, 0xf3, 0x07, 0xe7, 0xc7, 0x13, 0xac, 0x4c, 0xfc,
	0x55, 0xef, 0x39, 0x38, 0xa8, 0x85, 0xda, 0x73, 0x29, 0xa0, 0x2a, 0x04, 0x12, 0xa9, 0xb4, 0x9f,
	0x6b, 0xbb, 0xcc, 0x77, 0xfa, 0x97, 0x6a, 0xaf, 0xec, 0xf9, 0xee, 0xf4, 0xe7, 0x84, 0x7c, 0x38,
	0xe3, 0x79, 0x63, 0x45, 0x12, 0x0d, 0x1b, 0x68, 0x50, 0xe4, 0x43, 0xd3, 0x85, 0xfe, 0x6c, 0xf9,
	0x98, 0x24, 0x3a, 0xee, 0xf8, 0x38, 0xf2, 0x63, 0xcb, 0x7f, 0x39, 0x93, 0xe6, 0x11, 0x63, 0x92,
	0x68, 0x8c, 0xbb, 0x0d, 0x8c, 0x23, 0x1f, 0x63, 0xbb, 0xf3, 0x3a, 0xb0, 0xc1, 0x2e, 0x7f, 0x02,
	0x00, 0x00, 0xff, 0xff, 0xb6, 0x6c, 0x40, 0x82, 0xf2, 0x01, 0x00, 0x00,
}
