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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	enums "google.golang.org/genproto/googleapis/ads/googleads/v3/enums"
	_ "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

// A geo target constant.
type GeoTargetConstant struct {
	// The resource name of the geo target constant.
	// Geo target constant resource names have the form:
	//
	// `geoTargetConstants/{geo_target_constant_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// The ID of the geo target constant.
	Id *wrappers.Int64Value `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// Geo target constant English name.
	Name *wrappers.StringValue `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
	// The ISO-3166-1 alpha-2 country code that is associated with the target.
	CountryCode *wrappers.StringValue `protobuf:"bytes,5,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
	// Geo target constant target type.
	TargetType *wrappers.StringValue `protobuf:"bytes,6,opt,name=target_type,json=targetType,proto3" json:"target_type,omitempty"`
	// Geo target constant status.
	Status enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus `protobuf:"varint,7,opt,name=status,proto3,enum=google.ads.googleads.v3.enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus" json:"status,omitempty"`
	// The fully qualified English name, consisting of the target's name and that
	// of its parent and country.
	CanonicalName        *wrappers.StringValue `protobuf:"bytes,8,opt,name=canonical_name,json=canonicalName,proto3" json:"canonical_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_GeoTargetConstant proto.InternalMessageInfo

func (m *GeoTargetConstant) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func (m *GeoTargetConstant) GetId() *wrappers.Int64Value {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *GeoTargetConstant) GetName() *wrappers.StringValue {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *GeoTargetConstant) GetCountryCode() *wrappers.StringValue {
	if m != nil {
		return m.CountryCode
	}
	return nil
}

func (m *GeoTargetConstant) GetTargetType() *wrappers.StringValue {
	if m != nil {
		return m.TargetType
	}
	return nil
}

func (m *GeoTargetConstant) GetStatus() enums.GeoTargetConstantStatusEnum_GeoTargetConstantStatus {
	if m != nil {
		return m.Status
	}
	return enums.GeoTargetConstantStatusEnum_UNSPECIFIED
}

func (m *GeoTargetConstant) GetCanonicalName() *wrappers.StringValue {
	if m != nil {
		return m.CanonicalName
	}
	return nil
}

func init() {
	proto.RegisterType((*GeoTargetConstant)(nil), "google.ads.googleads.v3.resources.GeoTargetConstant")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/geo_target_constant.proto", fileDescriptor_28e0880fcfd2987c)
}

var fileDescriptor_28e0880fcfd2987c = []byte{
	// 490 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0x51, 0x6b, 0xd4, 0x40,
	0x10, 0xc7, 0x49, 0x7a, 0x9e, 0xba, 0xd7, 0x16, 0xcc, 0x83, 0xc4, 0x5a, 0xe4, 0xaa, 0x14, 0x0e,
	0x85, 0x8d, 0x34, 0xe2, 0x43, 0x8a, 0x4a, 0x7a, 0xc8, 0xa1, 0x0f, 0x52, 0xd2, 0x12, 0x50, 0x0e,
	0xc2, 0x36, 0x59, 0x97, 0xc8, 0x65, 0x27, 0x64, 0x37, 0x95, 0x43, 0x7c, 0xf2, 0x9b, 0xe8, 0x9b,
	0x1f, 0xc5, 0x8f, 0xd2, 0x4f, 0x21, 0xb7, 0xbb, 0xd9, 0x8a, 0x77, 0xa7, 0xf7, 0x36, 0xd9, 0xf9,
	0xff, 0x66, 0xfe, 0x3b, 0xb3, 0x41, 0xc7, 0x0c, 0x80, 0xcd, 0x68, 0x40, 0x0a, 0x11, 0xe8, 0x70,
	0x11, 0x5d, 0x86, 0x41, 0x43, 0x05, 0xb4, 0x4d, 0x4e, 0x45, 0xc0, 0x28, 0x64, 0x92, 0x34, 0x8c,
	0xca, 0x2c, 0x07, 0x2e, 0x24, 0xe1, 0x12, 0xd7, 0x0d, 0x48, 0xf0, 0x0e, 0x34, 0x81, 0x49, 0x21,
	0xb0, 0x85, 0xf1, 0x65, 0x88, 0x2d, 0xbc, 0xf7, 0x72, 0x5d, 0x7d, 0xca, 0xdb, 0x6a, 0x65, 0xed,
	0x4c, 0x48, 0x22, 0x5b, 0xa1, 0x5b, 0xec, 0xdd, 0xeb, 0xf8, 0xba, 0xb4, 0x96, 0x4c, 0xea, 0x81,
	0x49, 0xa9, 0xaf, 0x8b, 0xf6, 0x63, 0xf0, 0xb9, 0x21, 0x75, 0x4d, 0x9b, 0x0e, 0xdd, 0xff, 0x03,
	0x25, 0x9c, 0x83, 0x24, 0xb2, 0x04, 0x6e, 0xb2, 0x0f, 0x7f, 0xf4, 0xd0, 0x9d, 0x09, 0x85, 0x73,
	0xd5, 0x7c, 0x6c, 0x7a, 0x7b, 0x8f, 0xd0, 0x4e, 0xd7, 0x25, 0xe3, 0xa4, 0xa2, 0xbe, 0x33, 0x74,
	0x46, 0xb7, 0x93, 0xed, 0xee, 0xf0, 0x1d, 0xa9, 0xa8, 0xf7, 0x04, 0xb9, 0x65, 0xe1, 0x6f, 0x0d,
	0x9d, 0xd1, 0xe0, 0xe8, 0xbe, 0xb9, 0x38, 0xee, 0x5c, 0xe0, 0x37, 0x5c, 0x3e, 0x7f, 0x96, 0x92,
	0x59, 0x4b, 0x13, 0xb7, 0x2c, 0xbc, 0xa7, 0xa8, 0xa7, 0x0a, 0xf5, 0x94, 0x7c, 0x7f, 0x49, 0x7e,
	0x26, 0x9b, 0x92, 0x33, 0xad, 0x57, 0x4a, 0xef, 0x15, 0xda, 0xce, 0xa1, 0xe5, 0xb2, 0x99, 0x67,
	0x39, 0x14, 0xd4, 0xbf, 0xb1, 0x01, 0x39, 0x30, 0xc4, 0x18, 0x0a, 0xea, 0xbd, 0x40, 0x03, 0x33,
	0x53, 0x39, 0xaf, 0xa9, 0xdf, 0xdf, 0x80, 0x47, 0x1a, 0x38, 0x9f, 0xd7, 0xd4, 0xfb, 0x84, 0xfa,
	0x7a, 0x05, 0xfe, 0xcd, 0xa1, 0x33, 0xda, 0x3d, 0x4a, 0xf0, 0xba, 0x35, 0xab, 0x1d, 0xe2, 0xa5,
	0x29, 0x9e, 0x29, 0xfa, 0x35, 0x6f, 0xab, 0x75, 0xb9, 0xc4, 0x74, 0xf0, 0xc6, 0x68, 0x37, 0x27,
	0x1c, 0x78, 0x99, 0x93, 0x99, 0x1e, 0xf8, 0xad, 0x0d, 0xdc, 0xee, 0x58, 0x66, 0xb1, 0x8f, 0xe8,
	0xfd, 0x55, 0x9c, 0xa2, 0xc7, 0xd7, 0xce, 0x4c, 0x54, 0x97, 0x02, 0xe7, 0x50, 0x05, 0xcb, 0x5b,
	0x1e, 0xb1, 0xbf, 0x8f, 0x44, 0xf0, 0x65, 0xc5, 0x53, 0xfc, 0x7a, 0xf2, 0xcd, 0x45, 0x87, 0x39,
	0x54, 0xf8, 0xbf, 0x0f, 0xfd, 0xe4, 0xee, 0x52, 0x9b, 0xd3, 0x85, 0xf5, 0x53, 0xe7, 0xc3, 0x5b,
	0x03, 0x33, 0x98, 0x11, 0xce, 0x30, 0x34, 0x2c, 0x60, 0x94, 0xab, 0x8b, 0x05, 0xd7, 0x56, 0xff,
	0xf1, 0x07, 0x1e, 0xdb, 0xe8, 0xbb, 0xbb, 0x35, 0x89, 0xe3, 0x9f, 0xee, 0xc1, 0x44, 0x97, 0x8c,
	0x0b, 0x81, 0x75, 0xb8, 0x88, 0xd2, 0x10, 0x27, 0x9d, 0xf2, 0x57, 0xa7, 0x99, 0xc6, 0x85, 0x98,
	0x5a, 0xcd, 0x34, 0x0d, 0xa7, 0x56, 0x73, 0xe5, 0x1e, 0xea, 0x44, 0x14, 0xc5, 0x85, 0x88, 0x22,
	0xab, 0x8a, 0xa2, 0x34, 0x8c, 0x22, 0xab, 0xbb, 0xe8, 0x2b, 0xb3, 0xe1, 0xef, 0x00, 0x00, 0x00,
	0xff, 0xff, 0x81, 0x94, 0x66, 0x8c, 0x2d, 0x04, 0x00, 0x00,
}
