// 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 {
	// 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"`
	// 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"`
	// 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{
	// 421 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x52, 0x4f, 0x8b, 0xd4, 0x30,
	0x1c, 0xa5, 0x5d, 0x10, 0xac, 0xb3, 0x2b, 0xf6, 0x34, 0x0e, 0x22, 0xb3, 0xca, 0xc0, 0x9c, 0x12,
	0x98, 0xe2, 0x25, 0x1e, 0xb4, 0x45, 0x59, 0xf0, 0x20, 0x4b, 0x85, 0x1e, 0xb4, 0x38, 0x64, 0xda,
	0x9f, 0x25, 0xd8, 0x24, 0x25, 0x49, 0x67, 0x90, 0x65, 0xbf, 0x8c, 0x47, 0xbf, 0x84, 0x77, 0x3f,
	0xca, 0x7e, 0x08, 0x91, 0xfe, 0x49, 0x76, 0x66, 0x61, 0xdc, 0xdb, 0x4b, 0xde, 0x7b, 0xbf, 0xf7,
	0x7e, 0x4d, 0x83, 0x57, 0x95, 0x94, 0x55, 0x0d, 0x98, 0x96, 0x1a, 0x0f, 0xb0, 0x43, 0xdb, 0x08,
	0x2b, 0xd0, 0xb2, 0x55, 0x05, 0x68, 0x5c, 0x32, 0x6d, 0xa8, 0x28, 0x60, 0xbd, 0x65, 0xb0, 0x43,
	0x8d, 0x92, 0x46, 0x86, 0xe7, 0x83, 0x16, 0xd1, 0x52, 0x23, 0x67, 0x43, 0xdb, 0x08, 0x39, 0xdb,
	0x2c, 0x3a, 0x36, 0x19, 0x44, 0xcb, 0xf7, 0xa6, 0x6e, 0xda, 0xe2, 0x3b, 0x98, 0x61, 0xee, 0xec,
	0xa9, 0x35, 0x35, 0xcc, 0x35, 0x18, 0xa9, 0xe7, 0x23, 0xd5, 0x9f, 0x36, 0xed, 0x37, 0xbc, 0x53,
	0xb4, 0x69, 0x40, 0xe9, 0x91, 0x7f, 0xb6, 0x67, 0xa5, 0x42, 0x48, 0x43, 0x0d, 0x93, 0x62, 0x64,
	0x5f, 0xfc, 0xf6, 0x83, 0xc9, 0xbb, 0x31, 0x32, 0x63, 0xb0, 0x0b, 0x5f, 0x06, 0xa7, 0x36, 0x60,
	0x2d, 0x28, 0x87, 0xa9, 0x37, 0xf7, 0x96, 0x0f, 0xd3, 0x89, 0xbd, 0xfc, 0x48, 0x39, 0x84, 0x2c,
	0x78, 0x7c, 0xa7, 0xe7, 0xd4, 0x9f, 0x7b, 0xcb, 0xb3, 0xd5, 0x5b, 0x74, 0xec, 0x03, 0xf4, 0xdb,
	0x21, 0x1b, 0x95, 0xf4, 0xa6, 0xf7, 0xa2, 0xe5, 0x77, 0xae, 0xd2, 0xb3, 0xf2, 0xe0, 0x1c, 0xbe,
	0x09, 0x4e, 0x39, 0x18, 0xc5, 0x8a, 0xb5, 0xfe, 0xa1, 0x0d, 0xf0, 0xe9, 0xc9, 0xdc, 0x5b, 0x3e,
	0x5a, 0xcd, 0x6c, 0x90, 0x5d, 0x1b, 0x25, 0x52, 0xd6, 0x19, 0xad, 0x5b, 0x48, 0x27, 0x83, 0xe1,
	0x53, 0xaf, 0x27, 0x5f, 0x6f, 0xe2, 0x2f, 0xc1, 0xe2, 0xb6, 0xcb, 0x88, 0x1a, 0xa6, 0x51, 0x21,
	0x39, 0x3e, 0x58, 0x7e, 0x55, 0xb4, 0xda, 0x48, 0x0e, 0x4a, 0xe3, 0x2b, 0x0b, 0xaf, 0xdd, 0x93,
	0x74, 0x12, 0x8d, 0xaf, 0x0e, 0xde, 0xfd, 0x3a, 0xf9, 0xeb, 0x05, 0x8b, 0x42, 0x72, 0x74, 0xef,
	0xcb, 0x27, 0x4f, 0xf6, 0xb3, 0x2e, 0xbb, 0xde, 0x97, 0xde, 0xe7, 0x0f, 0xa3, 0xaf, 0x92, 0x35,
	0x15, 0x15, 0x92, 0xaa, 0xc2, 0x15, 0x88, 0x7e, 0x2b, 0x7c, 0x5b, 0xf5, 0x3f, 0xff, 0xe1, 0x6b,
	0x87, 0x7e, 0xfa, 0x27, 0x17, 0x71, 0xfc, 0xcb, 0x3f, 0xbf, 0x18, 0x46, 0xc6, 0xa5, 0x46, 0x03,
	0xec, 0x50, 0x16, 0xa1, 0xd4, 0x2a, 0xff, 0x58, 0x4d, 0x1e, 0x97, 0x3a, 0x77, 0x9a, 0x3c, 0x8b,
	0x72, 0xa7, 0xb9, 0xf1, 0x17, 0x03, 0x41, 0x48, 0x5c, 0x6a, 0x42, 0x9c, 0x8a, 0x90, 0x2c, 0x22,
	0xc4, 0xe9, 0x36, 0x0f, 0xfa, 0xb2, 0xd1, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x1d, 0x68,
	0x23, 0x33, 0x03, 0x00, 0x00,
}
