// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/errors/language_code_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 language code errors.
type LanguageCodeErrorEnum_LanguageCodeError int32

const (
	// Enum unspecified.
	LanguageCodeErrorEnum_UNSPECIFIED LanguageCodeErrorEnum_LanguageCodeError = 0
	// The received error code is not known in this version.
	LanguageCodeErrorEnum_UNKNOWN LanguageCodeErrorEnum_LanguageCodeError = 1
	// The input language code is not recognized.
	LanguageCodeErrorEnum_LANGUAGE_CODE_NOT_FOUND LanguageCodeErrorEnum_LanguageCodeError = 2
	// The language is not allowed to use.
	LanguageCodeErrorEnum_INVALID_LANGUAGE_CODE LanguageCodeErrorEnum_LanguageCodeError = 3
)

var LanguageCodeErrorEnum_LanguageCodeError_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "LANGUAGE_CODE_NOT_FOUND",
	3: "INVALID_LANGUAGE_CODE",
}

var LanguageCodeErrorEnum_LanguageCodeError_value = map[string]int32{
	"UNSPECIFIED":             0,
	"UNKNOWN":                 1,
	"LANGUAGE_CODE_NOT_FOUND": 2,
	"INVALID_LANGUAGE_CODE":   3,
}

func (x LanguageCodeErrorEnum_LanguageCodeError) String() string {
	return proto.EnumName(LanguageCodeErrorEnum_LanguageCodeError_name, int32(x))
}

func (LanguageCodeErrorEnum_LanguageCodeError) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1a902c8bd78e0aea, []int{0, 0}
}

// Container for enum describing language code errors.
type LanguageCodeErrorEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_LanguageCodeErrorEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.errors.LanguageCodeErrorEnum_LanguageCodeError", LanguageCodeErrorEnum_LanguageCodeError_name, LanguageCodeErrorEnum_LanguageCodeError_value)
	proto.RegisterType((*LanguageCodeErrorEnum)(nil), "google.ads.googleads.v3.errors.LanguageCodeErrorEnum")
}

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

var fileDescriptor_1a902c8bd78e0aea = []byte{
	// 326 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xcf, 0x4a, 0xf3, 0x40,
	0x14, 0xc5, 0xbf, 0xa4, 0xf0, 0x09, 0xd3, 0x85, 0x31, 0x50, 0xc5, 0x3f, 0x74, 0x91, 0x07, 0x98,
	0x2c, 0xb2, 0x91, 0x71, 0x35, 0x6d, 0xd2, 0x10, 0x2c, 0x93, 0x82, 0x26, 0x82, 0x04, 0x42, 0xec,
	0x0c, 0x43, 0xa0, 0x9d, 0x5b, 0x32, 0x6d, 0x1f, 0xc0, 0x47, 0x71, 0xe9, 0xa3, 0xf8, 0x28, 0xee,
	0x7c, 0x03, 0x49, 0xa6, 0x2d, 0x48, 0xd1, 0x55, 0x0e, 0x37, 0xbf, 0x73, 0xe7, 0x9e, 0x83, 0x6e,
	0x25, 0x80, 0x5c, 0x08, 0xbf, 0xe2, 0xda, 0x37, 0xb2, 0x55, 0xdb, 0xc0, 0x17, 0x4d, 0x03, 0x8d,
	0xf6, 0x17, 0x95, 0x92, 0x9b, 0x4a, 0x8a, 0x72, 0x0e, 0x5c, 0x94, 0xdd, 0x10, 0xaf, 0x1a, 0x58,
	0x83, 0x3b, 0x34, 0x38, 0xae, 0xb8, 0xc6, 0x07, 0x27, 0xde, 0x06, 0xd8, 0x38, 0xaf, 0x6e, 0xf6,
	0x9b, 0x57, 0xb5, 0x5f, 0x29, 0x05, 0xeb, 0x6a, 0x5d, 0x83, 0xd2, 0xc6, 0xed, 0xbd, 0x5a, 0x68,
	0x30, 0xdd, 0xed, 0x1e, 0x03, 0x17, 0x51, 0x6b, 0x8a, 0xd4, 0x66, 0xe9, 0xd5, 0xe8, 0xec, 0xe8,
	0x87, 0x7b, 0x8a, 0xfa, 0x19, 0x7b, 0x98, 0x45, 0xe3, 0x64, 0x92, 0x44, 0xa1, 0xf3, 0xcf, 0xed,
	0xa3, 0x93, 0x8c, 0xdd, 0xb3, 0xf4, 0x89, 0x39, 0x96, 0x7b, 0x8d, 0x2e, 0xa6, 0x94, 0xc5, 0x19,
	0x8d, 0xa3, 0x72, 0x9c, 0x86, 0x51, 0xc9, 0xd2, 0xc7, 0x72, 0x92, 0x66, 0x2c, 0x74, 0x6c, 0xf7,
	0x12, 0x0d, 0x12, 0x96, 0xd3, 0x69, 0x12, 0x96, 0x3f, 0x20, 0xa7, 0x37, 0xfa, 0xb2, 0x90, 0x37,
	0x87, 0x25, 0xfe, 0x3b, 0xc9, 0xe8, 0xfc, 0xe8, 0x9e, 0x59, 0x9b, 0x61, 0x66, 0x3d, 0x87, 0x3b,
	0xa7, 0x84, 0xb6, 0x27, 0x0c, 0x8d, 0xf4, 0xa5, 0x50, 0x5d, 0xc2, 0x7d, 0x9b, 0xab, 0x5a, 0xff,
	0x56, 0xee, 0x9d, 0xf9, 0xbc, 0xd9, 0xbd, 0x98, 0xd2, 0x77, 0x7b, 0x18, 0x9b, 0x65, 0x94, 0x6b,
	0x6c, 0x64, 0xab, 0xf2, 0x00, 0x77, 0x4f, 0xea, 0x8f, 0x3d, 0x50, 0x50, 0xae, 0x8b, 0x03, 0x50,
	0xe4, 0x41, 0x61, 0x80, 0x4f, 0xdb, 0x33, 0x53, 0x42, 0x28, 0xd7, 0x84, 0x1c, 0x10, 0x42, 0xf2,
	0x80, 0x10, 0x03, 0xbd, 0xfc, 0xef, 0xae, 0x0b, 0xbe, 0x03, 0x00, 0x00, 0xff, 0xff, 0xa9, 0xa5,
	0x9d, 0xc0, 0xf9, 0x01, 0x00, 0x00,
}
