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

// The possible asset field types.
type ServedAssetFieldTypeEnum_ServedAssetFieldType int32

const (
	// No value has been specified.
	ServedAssetFieldTypeEnum_UNSPECIFIED ServedAssetFieldTypeEnum_ServedAssetFieldType = 0
	// The received value is not known in this version.
	//
	// This is a response-only value.
	ServedAssetFieldTypeEnum_UNKNOWN ServedAssetFieldTypeEnum_ServedAssetFieldType = 1
	// The asset is used in headline 1.
	ServedAssetFieldTypeEnum_HEADLINE_1 ServedAssetFieldTypeEnum_ServedAssetFieldType = 2
	// The asset is used in headline 2.
	ServedAssetFieldTypeEnum_HEADLINE_2 ServedAssetFieldTypeEnum_ServedAssetFieldType = 3
	// The asset is used in headline 3.
	ServedAssetFieldTypeEnum_HEADLINE_3 ServedAssetFieldTypeEnum_ServedAssetFieldType = 4
	// The asset is used in description 1.
	ServedAssetFieldTypeEnum_DESCRIPTION_1 ServedAssetFieldTypeEnum_ServedAssetFieldType = 5
	// The asset is used in description 2.
	ServedAssetFieldTypeEnum_DESCRIPTION_2 ServedAssetFieldTypeEnum_ServedAssetFieldType = 6
)

var ServedAssetFieldTypeEnum_ServedAssetFieldType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "HEADLINE_1",
	3: "HEADLINE_2",
	4: "HEADLINE_3",
	5: "DESCRIPTION_1",
	6: "DESCRIPTION_2",
}

var ServedAssetFieldTypeEnum_ServedAssetFieldType_value = map[string]int32{
	"UNSPECIFIED":   0,
	"UNKNOWN":       1,
	"HEADLINE_1":    2,
	"HEADLINE_2":    3,
	"HEADLINE_3":    4,
	"DESCRIPTION_1": 5,
	"DESCRIPTION_2": 6,
}

func (x ServedAssetFieldTypeEnum_ServedAssetFieldType) String() string {
	return proto.EnumName(ServedAssetFieldTypeEnum_ServedAssetFieldType_name, int32(x))
}

func (ServedAssetFieldTypeEnum_ServedAssetFieldType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_22851b573f32db7f, []int{0, 0}
}

// Container for enum describing possible asset field types.
type ServedAssetFieldTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ServedAssetFieldTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.ServedAssetFieldTypeEnum_ServedAssetFieldType", ServedAssetFieldTypeEnum_ServedAssetFieldType_name, ServedAssetFieldTypeEnum_ServedAssetFieldType_value)
	proto.RegisterType((*ServedAssetFieldTypeEnum)(nil), "google.ads.googleads.v3.enums.ServedAssetFieldTypeEnum")
}

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

var fileDescriptor_22851b573f32db7f = []byte{
	// 344 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xdd, 0x4a, 0xc3, 0x30,
	0x14, 0xb6, 0x9d, 0x4e, 0xc8, 0x50, 0x63, 0xf1, 0x42, 0xc5, 0x5d, 0x6c, 0x0f, 0x90, 0xb2, 0xe5,
	0x2e, 0xbb, 0xca, 0xb6, 0x6e, 0x16, 0xa5, 0x2b, 0xee, 0x47, 0x90, 0x42, 0xa9, 0x26, 0x96, 0xc2,
	0x96, 0x94, 0xa5, 0x1b, 0xec, 0x15, 0x7c, 0x0c, 0x6f, 0x04, 0x1f, 0xc5, 0x47, 0xf1, 0xc2, 0x67,
	0x90, 0xa6, 0x6e, 0x30, 0x99, 0xde, 0x84, 0xef, 0x9c, 0xef, 0x7c, 0x1f, 0xe7, 0x7c, 0x01, 0xad,
	0x58, 0xca, 0x78, 0xca, 0xed, 0x88, 0x29, 0xbb, 0x80, 0x39, 0x5a, 0x62, 0x9b, 0x8b, 0xc5, 0x4c,
	0xd9, 0x8a, 0xcf, 0x97, 0x9c, 0x85, 0x91, 0x52, 0x3c, 0x0b, 0x9f, 0x13, 0x3e, 0x65, 0x61, 0xb6,
	0x4a, 0x39, 0x4a, 0xe7, 0x32, 0x93, 0x56, 0xb5, 0x50, 0xa0, 0x88, 0x29, 0xb4, 0x11, 0xa3, 0x25,
	0x46, 0x5a, 0x7c, 0x79, 0xb5, 0xf6, 0x4e, 0x13, 0x3b, 0x12, 0x42, 0x66, 0x51, 0x96, 0x48, 0xa1,
	0x0a, 0x71, 0xfd, 0xcd, 0x00, 0xe7, 0x43, 0x6d, 0x4f, 0x73, 0xf7, 0x5e, 0x6e, 0x3e, 0x5a, 0xa5,
	0xdc, 0x11, 0x8b, 0x59, 0xfd, 0xc5, 0x00, 0x67, 0xbb, 0x48, 0xeb, 0x04, 0x54, 0xc6, 0xde, 0xd0,
	0x77, 0x3a, 0x6e, 0xcf, 0x75, 0xba, 0x70, 0xcf, 0xaa, 0x80, 0xc3, 0xb1, 0x77, 0xe3, 0x0d, 0xee,
	0x3d, 0x68, 0x58, 0xc7, 0x00, 0x5c, 0x3b, 0xb4, 0x7b, 0xeb, 0x7a, 0x4e, 0xd8, 0x80, 0xe6, 0x56,
	0xdd, 0x84, 0xa5, 0xad, 0x1a, 0xc3, 0x7d, 0xeb, 0x14, 0x1c, 0x75, 0x9d, 0x61, 0xe7, 0xce, 0xf5,
	0x47, 0xee, 0xc0, 0x0b, 0x1b, 0xf0, 0xe0, 0x77, 0xab, 0x09, 0xcb, 0xed, 0x2f, 0x03, 0xd4, 0x9e,
	0xe4, 0x0c, 0xfd, 0x7b, 0x6d, 0xfb, 0x62, 0xd7, 0xbe, 0x7e, 0x7e, 0xaa, 0x6f, 0x3c, 0xb4, 0x7f,
	0xb4, 0xb1, 0x9c, 0x46, 0x22, 0x46, 0x72, 0x1e, 0xdb, 0x31, 0x17, 0x3a, 0x88, 0x75, 0xec, 0x69,
	0xa2, 0xfe, 0xf8, 0x85, 0x96, 0x7e, 0x5f, 0xcd, 0x52, 0x9f, 0xd2, 0x77, 0xb3, 0xda, 0x2f, 0xac,
	0x28, 0x53, 0xa8, 0x80, 0x39, 0x9a, 0x60, 0x94, 0x07, 0xa7, 0x3e, 0xd6, 0x7c, 0x40, 0x99, 0x0a,
	0x36, 0x7c, 0x30, 0xc1, 0x81, 0xe6, 0x3f, 0xcd, 0x5a, 0xd1, 0x24, 0x84, 0x32, 0x45, 0xc8, 0x66,
	0x82, 0x90, 0x09, 0x26, 0x44, 0xcf, 0x3c, 0x96, 0xf5, 0x62, 0xf8, 0x3b, 0x00, 0x00, 0xff, 0xff,
	0xed, 0xfc, 0xd1, 0x6b, 0x1d, 0x02, 0x00, 0x00,
}
