// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/media_upload_error.proto

package errors

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 media uploading errors.
type MediaUploadErrorEnum_MediaUploadError int32

const (
	// Enum unspecified.
	MediaUploadErrorEnum_UNSPECIFIED MediaUploadErrorEnum_MediaUploadError = 0
	// The received error code is not known in this version.
	MediaUploadErrorEnum_UNKNOWN MediaUploadErrorEnum_MediaUploadError = 1
	// The uploaded file is too big.
	MediaUploadErrorEnum_FILE_TOO_BIG MediaUploadErrorEnum_MediaUploadError = 2
	// Image data is unparseable.
	MediaUploadErrorEnum_UNPARSEABLE_IMAGE MediaUploadErrorEnum_MediaUploadError = 3
	// Animated images are not allowed.
	MediaUploadErrorEnum_ANIMATED_IMAGE_NOT_ALLOWED MediaUploadErrorEnum_MediaUploadError = 4
	// The image or media bundle format is not allowed.
	MediaUploadErrorEnum_FORMAT_NOT_ALLOWED MediaUploadErrorEnum_MediaUploadError = 5
	// Cannot reference URL external to the media bundle.
	MediaUploadErrorEnum_EXTERNAL_URL_NOT_ALLOWED MediaUploadErrorEnum_MediaUploadError = 6
	// HTML5 ad is trying to reference an asset not in .ZIP file.
	MediaUploadErrorEnum_INVALID_URL_REFERENCE MediaUploadErrorEnum_MediaUploadError = 7
	// The media bundle contains no primary entry.
	MediaUploadErrorEnum_MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY MediaUploadErrorEnum_MediaUploadError = 8
)

var MediaUploadErrorEnum_MediaUploadError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "FILE_TOO_BIG",
	3: "UNPARSEABLE_IMAGE",
	4: "ANIMATED_IMAGE_NOT_ALLOWED",
	5: "FORMAT_NOT_ALLOWED",
	6: "EXTERNAL_URL_NOT_ALLOWED",
	7: "INVALID_URL_REFERENCE",
	8: "MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY",
}

var MediaUploadErrorEnum_MediaUploadError_value = map[string]int32{
	"UNSPECIFIED":                        0,
	"UNKNOWN":                            1,
	"FILE_TOO_BIG":                       2,
	"UNPARSEABLE_IMAGE":                  3,
	"ANIMATED_IMAGE_NOT_ALLOWED":         4,
	"FORMAT_NOT_ALLOWED":                 5,
	"EXTERNAL_URL_NOT_ALLOWED":           6,
	"INVALID_URL_REFERENCE":              7,
	"MISSING_PRIMARY_MEDIA_BUNDLE_ENTRY": 8,
}

func (x MediaUploadErrorEnum_MediaUploadError) String() string {
	return proto.EnumName(MediaUploadErrorEnum_MediaUploadError_name, int32(x))
}

func (MediaUploadErrorEnum_MediaUploadError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_982d4add0547991f, []int{0, 0}
}

// Container for enum describing possible media uploading errors.
type MediaUploadErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_MediaUploadErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.MediaUploadErrorEnum_MediaUploadError", MediaUploadErrorEnum_MediaUploadError_name, MediaUploadErrorEnum_MediaUploadError_value)
	proto.RegisterType((*MediaUploadErrorEnum)(nil), "google.ads.googleads.v3.errors.MediaUploadErrorEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/errors/media_upload_error.proto", fileDescriptor_982d4add0547991f)
}

var fileDescriptor_982d4add0547991f = []byte{
	// 421 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xcf, 0x8a, 0xd3, 0x40,
	0x1c, 0xb6, 0x59, 0xdd, 0x95, 0x59, 0xc1, 0x71, 0xb0, 0xa2, 0xcb, 0xd2, 0x43, 0x0e, 0x1e, 0x27,
	0x87, 0x1c, 0x84, 0x78, 0x9a, 0x6c, 0x7e, 0x0d, 0x83, 0xc9, 0x24, 0x4c, 0x93, 0xae, 0x2b, 0x85,
	0x21, 0x9a, 0x12, 0x0a, 0x6d, 0x26, 0x64, 0xba, 0xfb, 0x12, 0xbe, 0x85, 0x47, 0x1f, 0xc5, 0x47,
	0xf1, 0x24, 0x3e, 0x81, 0x24, 0x63, 0x0b, 0xbb, 0xa0, 0xa7, 0x7c, 0x7c, 0xff, 0x32, 0x7c, 0x3f,
	0xf4, 0xae, 0xd1, 0xba, 0xd9, 0xae, 0xbd, 0xaa, 0x36, 0x9e, 0x85, 0x03, 0xba, 0xf3, 0xbd, 0x75,
	0xdf, 0xeb, 0xde, 0x78, 0xbb, 0x75, 0xbd, 0xa9, 0xd4, 0x6d, 0xb7, 0xd5, 0x55, 0xad, 0x46, 0x8e,
	0x76, 0xbd, 0xde, 0x6b, 0x32, 0xb3, 0x6e, 0x5a, 0xd5, 0x86, 0x1e, 0x83, 0xf4, 0xce, 0xa7, 0x36,
	0x78, 0x71, 0x79, 0x28, 0xee, 0x36, 0x5e, 0xd5, 0xb6, 0x7a, 0x5f, 0xed, 0x37, 0xba, 0x35, 0x36,
	0xed, 0x7e, 0x75, 0xd0, 0xcb, 0x74, 0xa8, 0x2e, 0xc7, 0x66, 0x18, 0x32, 0xd0, 0xde, 0xee, 0xdc,
	0xdf, 0x13, 0x84, 0x1f, 0x0a, 0xe4, 0x39, 0x3a, 0x2f, 0xc5, 0x22, 0x87, 0x2b, 0x3e, 0xe7, 0x10,
	0xe1, 0x47, 0xe4, 0x1c, 0x9d, 0x95, 0xe2, 0x83, 0xc8, 0xae, 0x05, 0x9e, 0x10, 0x8c, 0x9e, 0xcd,
	0x79, 0x02, 0xaa, 0xc8, 0x32, 0x15, 0xf2, 0x18, 0x3b, 0x64, 0x8a, 0x5e, 0x94, 0x22, 0x67, 0x72,
	0x01, 0x2c, 0x4c, 0x40, 0xf1, 0x94, 0xc5, 0x80, 0x4f, 0xc8, 0x0c, 0x5d, 0x30, 0xc1, 0x53, 0x56,
	0x40, 0x64, 0x39, 0x25, 0xb2, 0x42, 0xb1, 0x24, 0xc9, 0xae, 0x21, 0xc2, 0x8f, 0xc9, 0x2b, 0x44,
	0xe6, 0x99, 0x4c, 0x59, 0x71, 0x8f, 0x7f, 0x42, 0x2e, 0xd1, 0x6b, 0xf8, 0x58, 0x80, 0x14, 0x2c,
	0x51, 0xa5, 0x4c, 0xee, 0xa9, 0xa7, 0xe4, 0x0d, 0x9a, 0x72, 0xb1, 0x64, 0x09, 0x8f, 0x46, 0x51,
	0xc2, 0x1c, 0x24, 0x88, 0x2b, 0xc0, 0x67, 0xe4, 0x2d, 0x72, 0x53, 0xbe, 0x58, 0x70, 0x11, 0xab,
	0x5c, 0xf2, 0x94, 0xc9, 0x1b, 0x95, 0x42, 0xc4, 0x99, 0x0a, 0x4b, 0x11, 0x25, 0xa0, 0x40, 0x14,
	0xf2, 0x06, 0x3f, 0x0d, 0x7f, 0x4d, 0x90, 0xfb, 0x45, 0xef, 0xe8, 0xff, 0x27, 0x0d, 0xa7, 0x0f,
	0x87, 0xc9, 0x87, 0x2d, 0xf3, 0xc9, 0xa7, 0xe8, 0x6f, 0xb0, 0xd1, 0xdb, 0xaa, 0x6d, 0xa8, 0xee,
	0x1b, 0xaf, 0x59, 0xb7, 0xe3, 0xd2, 0x87, 0xa3, 0x76, 0x1b, 0xf3, 0xaf, 0x1b, 0xbf, 0xb7, 0x9f,
	0x6f, 0xce, 0x49, 0xcc, 0xd8, 0x77, 0x67, 0x16, 0xdb, 0x32, 0x56, 0x1b, 0x6a, 0xe1, 0x80, 0x96,
	0x3e, 0x1d, 0x7f, 0x69, 0x7e, 0x1c, 0x0c, 0x2b, 0x56, 0x9b, 0xd5, 0xd1, 0xb0, 0x5a, 0xfa, 0x2b,
	0x6b, 0xf8, 0xe9, 0xb8, 0x96, 0x0d, 0x02, 0x56, 0x9b, 0x20, 0x38, 0x5a, 0x82, 0x60, 0xe9, 0x07,
	0x81, 0x35, 0x7d, 0x3e, 0x1d, 0x5f, 0xe7, 0xff, 0x09, 0x00, 0x00, 0xff, 0xff, 0x42, 0x05, 0x58,
	0x25, 0x80, 0x02, 0x00, 0x00,
}
