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

package resources

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	_ "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 carrier criterion that can be used in campaign targeting.
type CarrierConstant struct {
	// Output only. The resource name of the carrier criterion.
	// Carrier criterion resource names have the form:
	//
	// `carrierConstants/{criterion_id}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// Output only. The ID of the carrier criterion.
	Id *wrappers.Int64Value `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	// Output only. The full name of the carrier in English.
	Name *wrappers.StringValue `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	// Output only. The country code of the country where the carrier is located, e.g., "AR",
	// "FR", etc.
	CountryCode          *wrappers.StringValue `protobuf:"bytes,4,opt,name=country_code,json=countryCode,proto3" json:"country_code,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_CarrierConstant proto.InternalMessageInfo

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

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

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

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

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

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

var fileDescriptor_41cfb443de8f3806 = []byte{
	// 431 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x92, 0x41, 0x8b, 0x13, 0x31,
	0x18, 0x86, 0x69, 0x66, 0x11, 0xcc, 0xae, 0x08, 0x83, 0x87, 0xba, 0x2e, 0xba, 0xab, 0x2c, 0x14,
	0x0f, 0xc9, 0xe2, 0xa8, 0x48, 0x3c, 0xa5, 0x15, 0x16, 0x3d, 0xe8, 0x52, 0xb1, 0x07, 0x29, 0x94,
	0x34, 0xc9, 0x8e, 0x81, 0x4e, 0xbe, 0x21, 0xc9, 0x54, 0x44, 0x3c, 0xf8, 0x57, 0x3c, 0xfa, 0x53,
	0xfc, 0x15, 0x7b, 0x5e, 0xff, 0x81, 0x27, 0xe9, 0x4c, 0x66, 0xb6, 0x56, 0xd0, 0xde, 0xde, 0x99,
	0xef, 0x7d, 0xde, 0xbc, 0x1f, 0x7c, 0xf8, 0x59, 0x0e, 0x90, 0x2f, 0x34, 0x15, 0xca, 0xd3, 0x46,
	0xae, 0xd4, 0x32, 0xa3, 0x4e, 0x7b, 0xa8, 0x9c, 0xd4, 0x9e, 0x4a, 0xe1, 0x9c, 0xd1, 0x6e, 0x26,
	0xc1, 0xfa, 0x20, 0x6c, 0x20, 0xa5, 0x83, 0x00, 0xe9, 0x51, 0x63, 0x27, 0x42, 0x79, 0xd2, 0x91,
	0x64, 0x99, 0x91, 0x8e, 0xdc, 0xbf, 0xd7, 0x86, 0x97, 0x86, 0x9e, 0x1b, 0xbd, 0x50, 0xb3, 0xb9,
	0xfe, 0x20, 0x96, 0x06, 0x5c, 0x93, 0xb1, 0x7f, 0x7b, 0xcd, 0xd0, 0x62, 0x71, 0x74, 0x37, 0x8e,
	0xea, 0xaf, 0x79, 0x75, 0x4e, 0x3f, 0x3a, 0x51, 0x96, 0xda, 0xf9, 0x38, 0x3f, 0x58, 0x43, 0x85,
	0xb5, 0x10, 0x44, 0x30, 0x60, 0xe3, 0xf4, 0xfe, 0x4f, 0x84, 0x6f, 0x8e, 0x9a, 0xde, 0xa3, 0x58,
	0x3b, 0x7d, 0x87, 0x6f, 0xb4, 0x6f, 0xcc, 0xac, 0x28, 0x74, 0xbf, 0x77, 0xd8, 0x1b, 0x5c, 0x1f,
	0x9e, 0x5c, 0xf0, 0xe4, 0x17, 0x7f, 0x88, 0x07, 0x57, 0x4b, 0x44, 0x55, 0x1a, 0x4f, 0x24, 0x14,
	0x74, 0x23, 0x68, 0xbc, 0xd7, 0xc6, 0xbc, 0x16, 0x85, 0x4e, 0x4f, 0x30, 0x32, 0xaa, 0x8f, 0x0e,
	0x7b, 0x83, 0xdd, 0x47, 0x77, 0x22, 0x4a, 0xda, 0xd6, 0xe4, 0xa5, 0x0d, 0x4f, 0x1f, 0x4f, 0xc4,
	0xa2, 0xd2, 0xc3, 0xe4, 0x82, 0x27, 0x63, 0x64, 0x54, 0xfa, 0x04, 0xef, 0xd4, 0xef, 0x27, 0x35,
	0x73, 0xf0, 0x17, 0xf3, 0x36, 0x38, 0x63, 0xf3, 0x35, 0xa8, 0xb6, 0xa7, 0x2f, 0xf0, 0x9e, 0x84,
	0xca, 0x06, 0xf7, 0x69, 0x26, 0x41, 0xe9, 0xfe, 0xce, 0xb6, 0xf8, 0x6e, 0xc4, 0x46, 0xa0, 0x34,
	0x1b, 0x5f, 0xf2, 0x37, 0xdb, 0xef, 0x9a, 0x3e, 0x90, 0x7f, 0xfe, 0xf0, 0xf4, 0xf3, 0xe6, 0x3d,
	0x7c, 0x19, 0x7e, 0x45, 0xf8, 0x58, 0x42, 0x41, 0xfe, 0x7b, 0x11, 0xc3, 0x5b, 0x1b, 0xf9, 0x67,
	0xab, 0xd2, 0x67, 0xbd, 0xf7, 0xaf, 0x22, 0x9a, 0xc3, 0x42, 0xd8, 0x9c, 0x80, 0xcb, 0x69, 0xae,
	0x6d, 0xbd, 0x12, 0xbd, 0x6a, 0xf8, 0x8f, 0x2b, 0x7d, 0xde, 0xa9, 0x6f, 0x28, 0x39, 0xe5, 0xfc,
	0x3b, 0x3a, 0x3a, 0x6d, 0x22, 0xb9, 0xf2, 0xa4, 0x91, 0x2b, 0x35, 0xc9, 0xc8, 0xb8, 0x75, 0xfe,
	0x68, 0x3d, 0x53, 0xae, 0xfc, 0xb4, 0xf3, 0x4c, 0x27, 0xd9, 0xb4, 0xf3, 0x5c, 0xa2, 0xe3, 0x66,
	0xc0, 0x18, 0x57, 0x9e, 0xb1, 0xce, 0xc5, 0xd8, 0x24, 0x63, 0xac, 0xf3, 0xcd, 0xaf, 0xd5, 0x65,
	0xb3, 0xdf, 0x01, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x85, 0x97, 0x7e, 0x51, 0x03, 0x00, 0x00,
}
