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

// Enum describing the possible placements of an asset.
type AssetFieldTypeEnum_AssetFieldType int32

const (
	// Not specified.
	AssetFieldTypeEnum_UNSPECIFIED AssetFieldTypeEnum_AssetFieldType = 0
	// Used for return value only. Represents value unknown in this version.
	AssetFieldTypeEnum_UNKNOWN AssetFieldTypeEnum_AssetFieldType = 1
	// The asset is linked for use as a headline.
	AssetFieldTypeEnum_HEADLINE AssetFieldTypeEnum_AssetFieldType = 2
	// The asset is linked for use as a description.
	AssetFieldTypeEnum_DESCRIPTION AssetFieldTypeEnum_AssetFieldType = 3
	// The asset is linked for use as mandatory ad text.
	AssetFieldTypeEnum_MANDATORY_AD_TEXT AssetFieldTypeEnum_AssetFieldType = 4
	// The asset is linked for use as a marketing image.
	AssetFieldTypeEnum_MARKETING_IMAGE AssetFieldTypeEnum_AssetFieldType = 5
	// The asset is linked for use as a media bundle.
	AssetFieldTypeEnum_MEDIA_BUNDLE AssetFieldTypeEnum_AssetFieldType = 6
	// The asset is linked for use as a YouTube video.
	AssetFieldTypeEnum_YOUTUBE_VIDEO AssetFieldTypeEnum_AssetFieldType = 7
)

var AssetFieldTypeEnum_AssetFieldType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "HEADLINE",
	3: "DESCRIPTION",
	4: "MANDATORY_AD_TEXT",
	5: "MARKETING_IMAGE",
	6: "MEDIA_BUNDLE",
	7: "YOUTUBE_VIDEO",
}

var AssetFieldTypeEnum_AssetFieldType_value = map[string]int32{
	"UNSPECIFIED":       0,
	"UNKNOWN":           1,
	"HEADLINE":          2,
	"DESCRIPTION":       3,
	"MANDATORY_AD_TEXT": 4,
	"MARKETING_IMAGE":   5,
	"MEDIA_BUNDLE":      6,
	"YOUTUBE_VIDEO":     7,
}

func (x AssetFieldTypeEnum_AssetFieldType) String() string {
	return proto.EnumName(AssetFieldTypeEnum_AssetFieldType_name, int32(x))
}

func (AssetFieldTypeEnum_AssetFieldType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1a10068170a3f176, []int{0, 0}
}

// Container for enum describing the possible placements of an asset.
type AssetFieldTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AssetFieldTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AssetFieldTypeEnum_AssetFieldType", AssetFieldTypeEnum_AssetFieldType_name, AssetFieldTypeEnum_AssetFieldType_value)
	proto.RegisterType((*AssetFieldTypeEnum)(nil), "google.ads.googleads.v3.enums.AssetFieldTypeEnum")
}

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

var fileDescriptor_1a10068170a3f176 = []byte{
	// 382 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcf, 0x8e, 0x93, 0x40,
	0x1c, 0x16, 0x56, 0x77, 0xcd, 0xec, 0xea, 0xce, 0xce, 0xc6, 0x8b, 0x71, 0x0f, 0xed, 0x03, 0x0c,
	0x07, 0x3c, 0x8d, 0xa7, 0xa1, 0x33, 0xc5, 0x49, 0xcb, 0x40, 0x5a, 0x40, 0x6b, 0x48, 0x08, 0x0a,
	0x12, 0x92, 0x96, 0x21, 0x1d, 0xda, 0xa4, 0x2f, 0xe3, 0xc1, 0xa3, 0x77, 0x5f, 0xc2, 0x27, 0x31,
	0x3e, 0x85, 0x01, 0x6c, 0x93, 0x1e, 0xdc, 0x0b, 0xf9, 0xf2, 0xfb, 0xfe, 0x84, 0xef, 0x1b, 0xf0,
	0xb6, 0x54, 0xaa, 0x5c, 0x17, 0x56, 0x96, 0x6b, 0x6b, 0x80, 0x1d, 0xda, 0xdb, 0x56, 0x51, 0xef,
	0x36, 0xda, 0xca, 0xb4, 0x2e, 0xda, 0xf4, 0x6b, 0x55, 0xac, 0xf3, 0xb4, 0x3d, 0x34, 0x05, 0x6e,
	0xb6, 0xaa, 0x55, 0xe8, 0x61, 0x90, 0xe2, 0x2c, 0xd7, 0xf8, 0xe4, 0xc2, 0x7b, 0x1b, 0xf7, 0xae,
	0xd7, 0x6f, 0x8e, 0xa1, 0x4d, 0x65, 0x65, 0x75, 0xad, 0xda, 0xac, 0xad, 0x54, 0xad, 0x07, 0xf3,
	0xf8, 0xa7, 0x01, 0x10, 0xed, 0x72, 0xa7, 0x5d, 0x6c, 0x78, 0x68, 0x0a, 0x5e, 0xef, 0x36, 0xe3,
	0x6f, 0x06, 0x78, 0x79, 0x7e, 0x46, 0xb7, 0xe0, 0x3a, 0x92, 0xcb, 0x80, 0x4f, 0xc4, 0x54, 0x70,
	0x06, 0x9f, 0xa0, 0x6b, 0x70, 0x15, 0xc9, 0x99, 0xf4, 0x3f, 0x48, 0x68, 0xa0, 0x1b, 0xf0, 0xfc,
	0x3d, 0xa7, 0x6c, 0x2e, 0x24, 0x87, 0x66, 0xa7, 0x65, 0x7c, 0x39, 0x59, 0x88, 0x20, 0x14, 0xbe,
	0x84, 0x17, 0xe8, 0x15, 0xb8, 0xf3, 0xa8, 0x64, 0x34, 0xf4, 0x17, 0xab, 0x94, 0xb2, 0x34, 0xe4,
	0x1f, 0x43, 0xf8, 0x14, 0xdd, 0x83, 0x5b, 0x8f, 0x2e, 0x66, 0x3c, 0x14, 0xd2, 0x4d, 0x85, 0x47,
	0x5d, 0x0e, 0x9f, 0x21, 0x08, 0x6e, 0x3c, 0xce, 0x04, 0x4d, 0x9d, 0x48, 0xb2, 0x39, 0x87, 0x97,
	0xe8, 0x0e, 0xbc, 0x58, 0xf9, 0x51, 0x18, 0x39, 0x3c, 0x8d, 0x05, 0xe3, 0x3e, 0xbc, 0x72, 0x7e,
	0x1b, 0x60, 0xf4, 0x45, 0x6d, 0xf0, 0xa3, 0xdd, 0x9d, 0xfb, 0xf3, 0x0e, 0x41, 0x57, 0x39, 0x30,
	0x3e, 0x39, 0xff, 0x5c, 0xa5, 0x5a, 0x67, 0x75, 0x89, 0xd5, 0xb6, 0xb4, 0xca, 0xa2, 0xee, 0x07,
	0x39, 0xee, 0xde, 0x54, 0xfa, 0x3f, 0xcf, 0xf0, 0xae, 0xff, 0x7e, 0x37, 0x2f, 0x5c, 0x4a, 0x7f,
	0x98, 0x0f, 0xee, 0x10, 0x45, 0x73, 0x8d, 0x07, 0xd8, 0xa1, 0xd8, 0xc6, 0xdd, 0x8c, 0xfa, 0xd7,
	0x91, 0x4f, 0x68, 0xae, 0x93, 0x13, 0x9f, 0xc4, 0x76, 0xd2, 0xf3, 0x7f, 0xcc, 0xd1, 0x70, 0x24,
	0x84, 0xe6, 0x9a, 0x90, 0x93, 0x82, 0x90, 0xd8, 0x26, 0xa4, 0xd7, 0x7c, 0xbe, 0xec, 0x7f, 0xcc,
	0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xbe, 0x0e, 0xae, 0x1e, 0x02, 0x00, 0x00,
}
