// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/ad_sharing_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 ad sharing errors.
type AdSharingErrorEnum_AdSharingError int32

const (
	// Enum unspecified.
	AdSharingErrorEnum_UNSPECIFIED AdSharingErrorEnum_AdSharingError = 0
	// The received error code is not known in this version.
	AdSharingErrorEnum_UNKNOWN AdSharingErrorEnum_AdSharingError = 1
	// Error resulting in attempting to add an Ad to an AdGroup that already
	// contains the Ad.
	AdSharingErrorEnum_AD_GROUP_ALREADY_CONTAINS_AD AdSharingErrorEnum_AdSharingError = 2
	// Ad is not compatible with the AdGroup it is being shared with.
	AdSharingErrorEnum_INCOMPATIBLE_AD_UNDER_AD_GROUP AdSharingErrorEnum_AdSharingError = 3
	// Cannot add AdGroupAd on inactive Ad.
	AdSharingErrorEnum_CANNOT_SHARE_INACTIVE_AD AdSharingErrorEnum_AdSharingError = 4
)

var AdSharingErrorEnum_AdSharingError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "AD_GROUP_ALREADY_CONTAINS_AD",
	3: "INCOMPATIBLE_AD_UNDER_AD_GROUP",
	4: "CANNOT_SHARE_INACTIVE_AD",
}

var AdSharingErrorEnum_AdSharingError_value = map[string]int32{
	"UNSPECIFIED":                    0,
	"UNKNOWN":                        1,
	"AD_GROUP_ALREADY_CONTAINS_AD":   2,
	"INCOMPATIBLE_AD_UNDER_AD_GROUP": 3,
	"CANNOT_SHARE_INACTIVE_AD":       4,
}

func (x AdSharingErrorEnum_AdSharingError) String() string {
	return proto.EnumName(AdSharingErrorEnum_AdSharingError_name, int32(x))
}

func (AdSharingErrorEnum_AdSharingError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_4892a55c96781176, []int{0, 0}
}

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

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

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

var xxx_messageInfo_AdSharingErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.AdSharingErrorEnum_AdSharingError", AdSharingErrorEnum_AdSharingError_name, AdSharingErrorEnum_AdSharingError_value)
	proto.RegisterType((*AdSharingErrorEnum)(nil), "google.ads.googleads.v3.errors.AdSharingErrorEnum")
}

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

var fileDescriptor_4892a55c96781176 = []byte{
	// 360 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0xeb, 0x40,
	0x14, 0x87, 0x6f, 0xd2, 0xcb, 0xbd, 0x30, 0x85, 0x7b, 0x43, 0xee, 0xe6, 0x22, 0xa5, 0x48, 0x1e,
	0x60, 0xb2, 0x08, 0x6e, 0xc6, 0xd5, 0x69, 0x32, 0xd6, 0x60, 0x9d, 0x84, 0xfc, 0x13, 0x25, 0x30,
	0x44, 0x53, 0x62, 0xa0, 0xcd, 0x94, 0x4c, 0xed, 0x83, 0xf8, 0x08, 0xee, 0xf4, 0x51, 0x7c, 0x14,
	0x17, 0x3e, 0x83, 0x24, 0x63, 0x0a, 0x5d, 0xe8, 0x6a, 0x7e, 0x1c, 0xbe, 0xef, 0xcc, 0x39, 0x07,
	0x9d, 0x54, 0x42, 0x54, 0xab, 0xa5, 0x5d, 0x94, 0xd2, 0x56, 0xb1, 0x4b, 0x3b, 0xc7, 0x5e, 0xb6,
	0xad, 0x68, 0xa5, 0x5d, 0x94, 0x5c, 0xde, 0x17, 0x6d, 0xdd, 0x54, 0xbc, 0xaf, 0xe0, 0x4d, 0x2b,
	0xb6, 0xc2, 0x9c, 0x2a, 0x16, 0x17, 0xa5, 0xc4, 0x7b, 0x0d, 0xef, 0x1c, 0xac, 0xb4, 0xa3, 0xc9,
	0xd0, 0x76, 0x53, 0xdb, 0x45, 0xd3, 0x88, 0x6d, 0xb1, 0xad, 0x45, 0x23, 0x95, 0x6d, 0x3d, 0x6b,
	0xc8, 0x84, 0x32, 0x56, 0x7d, 0x69, 0x67, 0xd0, 0xe6, 0x61, 0x6d, 0x3d, 0x6a, 0xe8, 0xcf, 0x61,
	0xd9, 0xfc, 0x8b, 0xc6, 0x29, 0x8b, 0x43, 0xea, 0xfa, 0x67, 0x3e, 0xf5, 0x8c, 0x1f, 0xe6, 0x18,
	0xfd, 0x4e, 0xd9, 0x05, 0x0b, 0xae, 0x98, 0xa1, 0x99, 0xc7, 0x68, 0x02, 0x1e, 0x9f, 0x47, 0x41,
	0x1a, 0x72, 0x58, 0x44, 0x14, 0xbc, 0x6b, 0xee, 0x06, 0x2c, 0x01, 0x9f, 0xc5, 0x1c, 0x3c, 0x43,
	0x37, 0x2d, 0x34, 0xf5, 0x99, 0x1b, 0x5c, 0x86, 0x90, 0xf8, 0xb3, 0x05, 0xe5, 0xe0, 0xf1, 0x94,
	0x79, 0x34, 0xe2, 0x83, 0x67, 0x8c, 0xcc, 0x09, 0xfa, 0xef, 0x02, 0x63, 0x41, 0xc2, 0xe3, 0x73,
	0x88, 0x28, 0xf7, 0x19, 0xb8, 0x89, 0x9f, 0x75, 0xb0, 0xf1, 0x73, 0xf6, 0xae, 0x21, 0xeb, 0x4e,
	0xac, 0xf1, 0xf7, 0x0b, 0xcf, 0xfe, 0x1d, 0x0e, 0x1e, 0x76, 0x7b, 0x86, 0xda, 0x8d, 0xf7, 0xa9,
	0x55, 0x62, 0x55, 0x34, 0x15, 0x16, 0x6d, 0x65, 0x57, 0xcb, 0xa6, 0xbf, 0xc2, 0x70, 0xee, 0x4d,
	0x2d, 0xbf, 0xba, 0xfe, 0xa9, 0x7a, 0x9e, 0xf4, 0xd1, 0x1c, 0xe0, 0x45, 0x9f, 0xce, 0x55, 0x33,
	0x28, 0x25, 0x56, 0xb1, 0x4b, 0x99, 0x83, 0xfb, 0x2f, 0xe5, 0xeb, 0x00, 0xe4, 0x50, 0xca, 0x7c,
	0x0f, 0xe4, 0x99, 0x93, 0x2b, 0xe0, 0x4d, 0xb7, 0x54, 0x95, 0x10, 0x28, 0x25, 0x21, 0x7b, 0x84,
	0x90, 0xcc, 0x21, 0x44, 0x41, 0xb7, 0xbf, 0xfa, 0xe9, 0x9c, 0x8f, 0x00, 0x00, 0x00, 0xff, 0xff,
	0x04, 0x28, 0xb3, 0x74, 0x1a, 0x02, 0x00, 0x00,
}
