// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/callout_placeholder_field.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 values for Callout placeholder fields.
type CalloutPlaceholderFieldEnum_CalloutPlaceholderField int32

const (
	// Not specified.
	CalloutPlaceholderFieldEnum_UNSPECIFIED CalloutPlaceholderFieldEnum_CalloutPlaceholderField = 0
	// Used for return value only. Represents value unknown in this version.
	CalloutPlaceholderFieldEnum_UNKNOWN CalloutPlaceholderFieldEnum_CalloutPlaceholderField = 1
	// Data Type: STRING. Callout text.
	CalloutPlaceholderFieldEnum_CALLOUT_TEXT CalloutPlaceholderFieldEnum_CalloutPlaceholderField = 2
)

var CalloutPlaceholderFieldEnum_CalloutPlaceholderField_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CALLOUT_TEXT",
}

var CalloutPlaceholderFieldEnum_CalloutPlaceholderField_value = map[string]int32{
	"UNSPECIFIED":  0,
	"UNKNOWN":      1,
	"CALLOUT_TEXT": 2,
}

func (x CalloutPlaceholderFieldEnum_CalloutPlaceholderField) String() string {
	return proto.EnumName(CalloutPlaceholderFieldEnum_CalloutPlaceholderField_name, int32(x))
}

func (CalloutPlaceholderFieldEnum_CalloutPlaceholderField) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_cb91159a825d5b02, []int{0, 0}
}

// Values for Callout placeholder fields.
type CalloutPlaceholderFieldEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CalloutPlaceholderFieldEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CalloutPlaceholderFieldEnum_CalloutPlaceholderField", CalloutPlaceholderFieldEnum_CalloutPlaceholderField_name, CalloutPlaceholderFieldEnum_CalloutPlaceholderField_value)
	proto.RegisterType((*CalloutPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.CalloutPlaceholderFieldEnum")
}

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

var fileDescriptor_cb91159a825d5b02 = []byte{
	// 308 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
	0x1c, 0xc6, 0x5d, 0x05, 0x85, 0x4c, 0xb0, 0xf4, 0x22, 0xe8, 0x76, 0xd8, 0x1e, 0x20, 0x39, 0xe4,
	0x16, 0xf1, 0x90, 0xcd, 0x6e, 0x0c, 0x47, 0x57, 0x70, 0x9b, 0x22, 0x85, 0x11, 0x97, 0x98, 0x15,
	0xb2, 0xa4, 0x2c, 0xdd, 0x1e, 0xc8, 0xa3, 0x8f, 0xe2, 0xa3, 0x78, 0xf3, 0x0d, 0xa4, 0x89, 0xab,
	0xa7, 0x7a, 0x29, 0x1f, 0xfd, 0xfe, 0xdf, 0x2f, 0xdf, 0xff, 0x0f, 0xee, 0xa4, 0x31, 0x52, 0x09,
	0xc4, 0xb8, 0x45, 0x5e, 0x56, 0xea, 0x80, 0x91, 0xd0, 0xfb, 0xad, 0x45, 0x6b, 0xa6, 0x94, 0xd9,
	0x97, 0xab, 0x42, 0xb1, 0xb5, 0xd8, 0x18, 0xc5, 0xc5, 0x6e, 0xf5, 0x96, 0x0b, 0xc5, 0x61, 0xb1,
	0x33, 0xa5, 0x89, 0xba, 0x3e, 0x03, 0x19, 0xb7, 0xb0, 0x8e, 0xc3, 0x03, 0x86, 0x2e, 0x7e, 0xdd,
	0x39, 0xd2, 0x8b, 0x1c, 0x31, 0xad, 0x4d, 0xc9, 0xca, 0xdc, 0x68, 0xeb, 0xc3, 0xfd, 0x0d, 0xb8,
	0x19, 0x7a, 0x7e, 0xfa, 0x87, 0x1f, 0x55, 0xf4, 0x58, 0xef, 0xb7, 0xfd, 0x09, 0xb8, 0x6a, 0xb0,
	0xa3, 0x4b, 0xd0, 0x5e, 0x24, 0x8f, 0x69, 0x3c, 0x9c, 0x8c, 0x26, 0xf1, 0x7d, 0x78, 0x12, 0xb5,
	0xc1, 0xf9, 0x22, 0x79, 0x48, 0x66, 0x4f, 0x49, 0xd8, 0x8a, 0x42, 0x70, 0x31, 0xa4, 0xd3, 0xe9,
	0x6c, 0x31, 0x5f, 0xcd, 0xe3, 0xe7, 0x79, 0x18, 0x0c, 0xbe, 0x5b, 0xa0, 0xb7, 0x36, 0x5b, 0xf8,
	0x6f, 0xdb, 0x41, 0xa7, 0xe1, 0xb9, 0xb4, 0x6a, 0x9b, 0xb6, 0x5e, 0x06, 0xbf, 0x71, 0x69, 0x14,
	0xd3, 0x12, 0x9a, 0x9d, 0x44, 0x52, 0x68, 0xb7, 0xcb, 0xf1, 0x76, 0x45, 0x6e, 0x1b, 0x4e, 0x79,
	0xeb, 0xbe, 0xef, 0xc1, 0xe9, 0x98, 0xd2, 0x8f, 0xa0, 0x3b, 0xf6, 0x28, 0xca, 0x2d, 0xf4, 0xb2,
	0x52, 0x4b, 0x0c, 0xab, 0xcd, 0xed, 0xe7, 0xd1, 0xcf, 0x28, 0xb7, 0x59, 0xed, 0x67, 0x4b, 0x9c,
	0x39, 0xff, 0x2b, 0xe8, 0xf9, 0x9f, 0x84, 0x50, 0x6e, 0x09, 0xa9, 0x27, 0x08, 0x59, 0x62, 0x42,
	0xdc, 0xcc, 0xeb, 0x99, 0x2b, 0x86, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xaa, 0x3b, 0x7e, 0x6e,
	0xe2, 0x01, 0x00, 0x00,
}
