// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/asset_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 possible types of asset.
type AssetTypeEnum_AssetType int32

const (
	// Not specified.
	AssetTypeEnum_UNSPECIFIED AssetTypeEnum_AssetType = 0
	// Used for return value only. Represents value unknown in this version.
	AssetTypeEnum_UNKNOWN AssetTypeEnum_AssetType = 1
	// YouTube video asset.
	AssetTypeEnum_YOUTUBE_VIDEO AssetTypeEnum_AssetType = 2
	// Media bundle asset.
	AssetTypeEnum_MEDIA_BUNDLE AssetTypeEnum_AssetType = 3
	// Image asset.
	AssetTypeEnum_IMAGE AssetTypeEnum_AssetType = 4
	// Text asset.
	AssetTypeEnum_TEXT AssetTypeEnum_AssetType = 5
)

var AssetTypeEnum_AssetType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "YOUTUBE_VIDEO",
	3: "MEDIA_BUNDLE",
	4: "IMAGE",
	5: "TEXT",
}

var AssetTypeEnum_AssetType_value = map[string]int32{
	"UNSPECIFIED":   0,
	"UNKNOWN":       1,
	"YOUTUBE_VIDEO": 2,
	"MEDIA_BUNDLE":  3,
	"IMAGE":         4,
	"TEXT":          5,
}

func (x AssetTypeEnum_AssetType) String() string {
	return proto.EnumName(AssetTypeEnum_AssetType_name, int32(x))
}

func (AssetTypeEnum_AssetType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d2719617ac292991, []int{0, 0}
}

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

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

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

var xxx_messageInfo_AssetTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.AssetTypeEnum_AssetType", AssetTypeEnum_AssetType_name, AssetTypeEnum_AssetType_value)
	proto.RegisterType((*AssetTypeEnum)(nil), "google.ads.googleads.v3.enums.AssetTypeEnum")
}

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

var fileDescriptor_d2719617ac292991 = []byte{
	// 325 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0x4f, 0x4f, 0xc2, 0x30,
	0x18, 0xc6, 0x65, 0x80, 0x4a, 0x11, 0xad, 0x3d, 0x1a, 0x39, 0xc0, 0x07, 0xe8, 0x0e, 0xbb, 0xd5,
	0x53, 0xe7, 0x2a, 0x59, 0x94, 0x41, 0xe2, 0x36, 0xff, 0x64, 0x09, 0x99, 0x6c, 0x59, 0x48, 0xa0,
	0x5d, 0x68, 0x21, 0xe1, 0xeb, 0x78, 0xf4, 0xa3, 0xf8, 0x35, 0xbc, 0xf9, 0x29, 0xcc, 0x5a, 0xb7,
	0x9b, 0x5e, 0x9a, 0x27, 0xef, 0xfb, 0x7b, 0x9f, 0x3c, 0x7d, 0x00, 0x2e, 0x84, 0x28, 0xd6, 0xb9,
	0x9d, 0x66, 0xd2, 0x36, 0xb2, 0x52, 0x7b, 0xc7, 0xce, 0xf9, 0x6e, 0x23, 0xed, 0x54, 0xca, 0x5c,
	0x2d, 0xd4, 0xa1, 0xcc, 0x71, 0xb9, 0x15, 0x4a, 0xa0, 0xa1, 0x81, 0x70, 0x9a, 0x49, 0xdc, 0xf0,
	0x78, 0xef, 0x60, 0xcd, 0x5f, 0x5d, 0xd7, 0x76, 0xe5, 0xca, 0x4e, 0x39, 0x17, 0x2a, 0x55, 0x2b,
	0xc1, 0xa5, 0x39, 0x1e, 0x2b, 0x30, 0xa0, 0x95, 0x61, 0x78, 0x28, 0x73, 0xc6, 0x77, 0x9b, 0xf1,
	0x12, 0xf4, 0x9a, 0x01, 0xba, 0x00, 0xfd, 0x28, 0x78, 0x9c, 0xb3, 0x5b, 0xff, 0xce, 0x67, 0x1e,
	0x3c, 0x42, 0x7d, 0x70, 0x12, 0x05, 0xf7, 0xc1, 0xec, 0x29, 0x80, 0x2d, 0x74, 0x09, 0x06, 0x2f,
	0xb3, 0x28, 0x8c, 0x5c, 0xb6, 0x88, 0x7d, 0x8f, 0xcd, 0xa0, 0x85, 0x20, 0x38, 0x9b, 0x32, 0xcf,
	0xa7, 0x0b, 0x37, 0x0a, 0xbc, 0x07, 0x06, 0xdb, 0xa8, 0x07, 0xba, 0xfe, 0x94, 0x4e, 0x18, 0xec,
	0xa0, 0x53, 0xd0, 0x09, 0xd9, 0x73, 0x08, 0xbb, 0xee, 0x57, 0x0b, 0x8c, 0x96, 0x62, 0x83, 0xff,
	0x4d, 0xee, 0x9e, 0x37, 0x41, 0xe6, 0x55, 0xd6, 0x79, 0xeb, 0xd5, 0xfd, 0x3d, 0x28, 0xc4, 0x3a,
	0xe5, 0x05, 0x16, 0xdb, 0xc2, 0x2e, 0x72, 0xae, 0x7f, 0x52, 0x57, 0x55, 0xae, 0xe4, 0x1f, 0xcd,
	0xdd, 0xe8, 0xf7, 0xdd, 0x6a, 0x4f, 0x28, 0xfd, 0xb0, 0x86, 0x13, 0x63, 0x45, 0x33, 0x89, 0x8d,
	0xac, 0x54, 0xec, 0xe0, 0xaa, 0x05, 0xf9, 0x59, 0xef, 0x13, 0x9a, 0xc9, 0xa4, 0xd9, 0x27, 0xb1,
	0x93, 0xe8, 0xfd, 0xb7, 0x35, 0x32, 0x43, 0x42, 0x68, 0x26, 0x09, 0x69, 0x08, 0x42, 0x62, 0x87,
	0x10, 0xcd, 0xbc, 0x1d, 0xeb, 0x60, 0xce, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb8, 0xed, 0x6d,
	0xbe, 0xd1, 0x01, 0x00, 0x00,
}
