// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/ad_customizer_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 Ad Customizers placeholder fields.
type AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField int32

const (
	// Not specified.
	AdCustomizerPlaceholderFieldEnum_UNSPECIFIED AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 0
	// Used for return value only. Represents value unknown in this version.
	AdCustomizerPlaceholderFieldEnum_UNKNOWN AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 1
	// Data Type: INT64. Integer value to be inserted.
	AdCustomizerPlaceholderFieldEnum_INTEGER AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 2
	// Data Type: STRING. Price value to be inserted.
	AdCustomizerPlaceholderFieldEnum_PRICE AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 3
	// Data Type: DATE_TIME. Date value to be inserted.
	AdCustomizerPlaceholderFieldEnum_DATE AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 4
	// Data Type: STRING. String value to be inserted.
	AdCustomizerPlaceholderFieldEnum_STRING AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField = 5
)

var AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "INTEGER",
	3: "PRICE",
	4: "DATE",
	5: "STRING",
}

var AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_value = map[string]int32{
	"UNSPECIFIED": 0,
	"UNKNOWN":     1,
	"INTEGER":     2,
	"PRICE":       3,
	"DATE":        4,
	"STRING":      5,
}

func (x AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField) String() string {
	return proto.EnumName(AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_name, int32(x))
}

func (AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_af5941c12bdd346d, []int{0, 0}
}

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

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

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

var xxx_messageInfo_AdCustomizerPlaceholderFieldEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField", AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_name, AdCustomizerPlaceholderFieldEnum_AdCustomizerPlaceholderField_value)
	proto.RegisterType((*AdCustomizerPlaceholderFieldEnum)(nil), "google.ads.googleads.v3.enums.AdCustomizerPlaceholderFieldEnum")
}

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

var fileDescriptor_af5941c12bdd346d = []byte{
	// 339 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x4d, 0x4e, 0xf3, 0x30,
	0x14, 0xfc, 0x92, 0xfe, 0x7c, 0xe0, 0x2e, 0x88, 0xb2, 0x44, 0xad, 0x44, 0x7b, 0x00, 0x67, 0x91,
	0x9d, 0x59, 0xb9, 0xa9, 0x1b, 0x45, 0x48, 0x21, 0xea, 0x1f, 0x12, 0x8a, 0x54, 0x99, 0xda, 0x84,
	0xa0, 0xc4, 0x8e, 0xe2, 0xb4, 0x0b, 0x0e, 0xc1, 0x21, 0x58, 0x72, 0x14, 0x8e, 0xc2, 0x01, 0x58,
	0xa3, 0xc4, 0x34, 0xac, 0xe8, 0x26, 0x9a, 0xf8, 0xcd, 0x9b, 0x79, 0x33, 0xc0, 0x4b, 0xa4, 0x4c,
	0x32, 0xee, 0x50, 0xa6, 0x1c, 0x0d, 0x6b, 0x74, 0x70, 0x1d, 0x2e, 0xf6, 0xb9, 0x72, 0x28, 0xdb,
	0xee, 0xf6, 0xaa, 0x92, 0x79, 0xfa, 0xc2, 0xcb, 0x6d, 0x91, 0xd1, 0x1d, 0x7f, 0x92, 0x19, 0xe3,
	0xe5, 0xf6, 0x31, 0xe5, 0x19, 0x83, 0x45, 0x29, 0x2b, 0x69, 0x8f, 0xf4, 0x26, 0xa4, 0x4c, 0xc1,
	0x56, 0x04, 0x1e, 0x5c, 0xd8, 0x88, 0x5c, 0x0e, 0x8f, 0x1e, 0x45, 0xea, 0x50, 0x21, 0x64, 0x45,
	0xab, 0x54, 0x0a, 0xa5, 0x97, 0x27, 0xaf, 0x06, 0xb8, 0xc2, 0xcc, 0x6b, 0x5d, 0xa2, 0x5f, 0x93,
	0x79, 0xed, 0x41, 0xc4, 0x3e, 0x9f, 0x3c, 0x83, 0xe1, 0x29, 0x8e, 0x7d, 0x01, 0x06, 0xeb, 0x70,
	0x19, 0x11, 0x2f, 0x98, 0x07, 0x64, 0x66, 0xfd, 0xb3, 0x07, 0xe0, 0xff, 0x3a, 0xbc, 0x09, 0x6f,
	0xef, 0x42, 0xcb, 0xa8, 0x7f, 0x82, 0x70, 0x45, 0x7c, 0xb2, 0xb0, 0x4c, 0xfb, 0x1c, 0xf4, 0xa2,
	0x45, 0xe0, 0x11, 0xab, 0x63, 0x9f, 0x81, 0xee, 0x0c, 0xaf, 0x88, 0xd5, 0xb5, 0x01, 0xe8, 0x2f,
	0x57, 0x8b, 0x20, 0xf4, 0xad, 0xde, 0xf4, 0xcb, 0x00, 0xe3, 0x9d, 0xcc, 0xe1, 0xc9, 0x50, 0xd3,
	0xf1, 0xa9, 0x7b, 0xa2, 0x3a, 0x59, 0x64, 0xdc, 0x4f, 0x7f, 0x34, 0x12, 0x99, 0x51, 0x91, 0x40,
	0x59, 0x26, 0x4e, 0xc2, 0x45, 0x93, 0xfb, 0xd8, 0x76, 0x91, 0xaa, 0x3f, 0xca, 0xbf, 0x6e, 0xbe,
	0x6f, 0x66, 0xc7, 0xc7, 0xf8, 0xdd, 0x1c, 0xf9, 0x5a, 0x0a, 0x33, 0x05, 0x35, 0xac, 0xd1, 0xc6,
	0x85, 0x75, 0x3f, 0xea, 0xe3, 0x38, 0x8f, 0x31, 0x53, 0x71, 0x3b, 0x8f, 0x37, 0x6e, 0xdc, 0xcc,
	0x3f, 0xcd, 0xb1, 0x7e, 0x44, 0x08, 0x33, 0x85, 0x50, 0xcb, 0x40, 0x68, 0xe3, 0x22, 0xd4, 0x70,
	0x1e, 0xfa, 0xcd, 0x61, 0xee, 0x77, 0x00, 0x00, 0x00, 0xff, 0xff, 0x68, 0x85, 0xbb, 0x81, 0x14,
	0x02, 0x00, 0x00,
}
