// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/resources/distance_view.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 distance view with metrics aggregated by the user's distance from an
// advertiser's location extensions. Each DistanceBucket includes all
// impressions that fall within its distance and a single impression will
// contribute to the metrics for all DistanceBuckets that include the user's
// distance.
type DistanceView struct {
	// Output only. The resource name of the distance view.
	// Distance view resource names have the form:
	//
	// `customers/{customer_id}/distanceViews/1~{distance_bucket}`
	ResourceName string `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	// Output only. Grouping of user distance from location extensions.
	DistanceBucket enums.DistanceBucketEnum_DistanceBucket `protobuf:"varint,2,opt,name=distance_bucket,json=distanceBucket,proto3,enum=google.ads.googleads.v3.enums.DistanceBucketEnum_DistanceBucket" json:"distance_bucket,omitempty"`
	// Output only. True if the DistanceBucket is using the metric system, false otherwise.
	MetricSystem         *wrappers.BoolValue `protobuf:"bytes,3,opt,name=metric_system,json=metricSystem,proto3" json:"metric_system,omitempty"`
	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
	XXX_unrecognized     []byte              `json:"-"`
	XXX_sizecache        int32               `json:"-"`
}

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

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

var xxx_messageInfo_DistanceView proto.InternalMessageInfo

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

func (m *DistanceView) GetDistanceBucket() enums.DistanceBucketEnum_DistanceBucket {
	if m != nil {
		return m.DistanceBucket
	}
	return enums.DistanceBucketEnum_UNSPECIFIED
}

func (m *DistanceView) GetMetricSystem() *wrappers.BoolValue {
	if m != nil {
		return m.MetricSystem
	}
	return nil
}

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

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

var fileDescriptor_dad7deb2cae396f2 = []byte{
	// 454 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4d, 0x6b, 0xd4, 0x40,
	0x18, 0x26, 0x09, 0x08, 0xc6, 0x6d, 0xc5, 0x9c, 0xd6, 0x45, 0x74, 0x2b, 0x2c, 0xee, 0xc5, 0x19,
	0xd8, 0xe0, 0x65, 0xbc, 0x38, 0xa1, 0x52, 0xf0, 0x20, 0x65, 0x85, 0x1c, 0x74, 0x71, 0x99, 0x4d,
	0xde, 0xc6, 0xc1, 0xcc, 0x4c, 0x98, 0x49, 0x76, 0x91, 0xd2, 0x3f, 0xe3, 0xd1, 0x9f, 0xe2, 0xaf,
	0xe8, 0xb9, 0xbf, 0x40, 0x3c, 0x88, 0xe4, 0x63, 0xd2, 0xb4, 0xb0, 0xda, 0xdb, 0x93, 0x79, 0x3e,
	0xde, 0x8f, 0xbc, 0xfe, 0xab, 0x4c, 0xa9, 0x2c, 0x07, 0xcc, 0x52, 0x83, 0x5b, 0x58, 0xa3, 0x6d,
	0x88, 0x35, 0x18, 0x55, 0xe9, 0x04, 0x0c, 0x4e, 0xb9, 0x29, 0x99, 0x4c, 0x60, 0xbd, 0xe5, 0xb0,
	0x43, 0x85, 0x56, 0xa5, 0x0a, 0x8e, 0x5a, 0x2d, 0x62, 0xa9, 0x41, 0xbd, 0x0d, 0x6d, 0x43, 0xd4,
	0xdb, 0x26, 0xe1, 0xbe, 0x64, 0x90, 0x95, 0x18, 0xa4, 0x6e, 0xaa, 0xe4, 0x2b, 0x94, 0x6d, 0xee,
	0xe4, 0x99, 0x35, 0x15, 0x1c, 0x9f, 0x71, 0xc8, 0xd3, 0xf5, 0x06, 0xbe, 0xb0, 0x2d, 0x57, 0xba,
	0x13, 0x3c, 0x1e, 0x08, 0x6c, 0xad, 0x8e, 0x7a, 0xda, 0x51, 0xcd, 0xd7, 0xa6, 0x3a, 0xc3, 0x3b,
	0xcd, 0x8a, 0x02, 0xb4, 0xe9, 0xf8, 0x27, 0x03, 0x2b, 0x93, 0x52, 0x95, 0xac, 0xe4, 0x4a, 0x76,
	0xec, 0xf3, 0x5f, 0xae, 0x3f, 0x3a, 0xee, 0x7a, 0x8a, 0x39, 0xec, 0x82, 0xa5, 0x7f, 0x60, 0x0b,
	0xac, 0x25, 0x13, 0x30, 0x76, 0xa6, 0xce, 0xfc, 0x7e, 0xf4, 0xf2, 0x92, 0x7a, 0xbf, 0xe9, 0x0b,
	0x7f, 0x76, 0x3d, 0x76, 0x87, 0x0a, 0x6e, 0x50, 0xa2, 0x04, 0x1e, 0xa6, 0x2c, 0x47, 0x36, 0xe3,
	0x3d, 0x13, 0x10, 0x48, 0xff, 0xe1, 0xad, 0xb9, 0xc7, 0xee, 0xd4, 0x99, 0x1f, 0x2e, 0xde, 0xa0,
	0x7d, 0x0b, 0x6d, 0xb6, 0x85, 0x6c, 0x66, 0xd4, 0x98, 0xde, 0xca, 0x4a, 0xdc, 0x7a, 0x8a, 0xbc,
	0x4b, 0xea, 0x2d, 0x0f, 0xd3, 0x1b, 0x8f, 0xc1, 0xb1, 0x7f, 0x20, 0xa0, 0xd4, 0x3c, 0x59, 0x9b,
	0x6f, 0xa6, 0x04, 0x31, 0xf6, 0xa6, 0xce, 0xfc, 0xc1, 0x62, 0x62, 0xab, 0xd9, 0x55, 0xa1, 0x48,
	0xa9, 0x3c, 0x66, 0x79, 0x05, 0x6d, 0xce, 0xa8, 0x75, 0x7d, 0x68, 0x4c, 0xe4, 0xf3, 0x15, 0xfd,
	0x74, 0xc7, 0x79, 0x83, 0x45, 0x52, 0x99, 0x52, 0x09, 0xd0, 0x06, 0x9f, 0x5b, 0x78, 0xd1, 0xff,
	0xec, 0x5a, 0x62, 0xf0, 0xf9, 0x8d, 0x8b, 0xba, 0x88, 0xfe, 0x38, 0xfe, 0x2c, 0x51, 0x02, 0xfd,
	0xf7, 0xa6, 0xa2, 0x47, 0xc3, 0x5a, 0xa7, 0x75, 0xf3, 0xa7, 0xce, 0xc7, 0x77, 0x9d, 0x2f, 0x53,
	0x39, 0x93, 0x19, 0x52, 0x3a, 0xc3, 0x19, 0xc8, 0x66, 0x34, 0x7c, 0xdd, 0xea, 0x3f, 0x2e, 0xfc,
	0x75, 0x8f, 0xbe, 0xbb, 0xde, 0x09, 0xa5, 0x3f, 0xdc, 0xa3, 0x93, 0x36, 0x92, 0xa6, 0x06, 0xb5,
	0xb0, 0x46, 0x71, 0x88, 0x96, 0x56, 0xf9, 0xd3, 0x6a, 0x56, 0x34, 0x35, 0xab, 0x5e, 0xb3, 0x8a,
	0xc3, 0x55, 0xaf, 0xb9, 0x72, 0x67, 0x2d, 0x41, 0x08, 0x4d, 0x0d, 0x21, 0xbd, 0x8a, 0x90, 0x38,
	0x24, 0xa4, 0xd7, 0x6d, 0xee, 0x35, 0xcd, 0x86, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0x44, 0xb7,
	0x50, 0x67, 0x8d, 0x03, 0x00, 0x00,
}
