// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/servicedirectory/v1beta1/endpoint.proto

package servicedirectory

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

// An individual endpoint that provides a
// [service][google.cloud.servicedirectory.v1beta1.Service]. The service must
// already exist to create an endpoint.
type Endpoint struct {
	// Immutable. The resource name for the endpoint in the format
	// 'projects/*/locations/*/namespaces/*/services/*/endpoints/*'.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// Optional. An IPv4 or IPv6 address. Service Directory will reject bad
	// addresses like:
	//   "8.8.8"
	//   "8.8.8.8:53"
	//   "test:bad:address"
	//   "[::1]"
	//   "[::1]:8080"
	// Limited to 45 characters.
	Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"`
	// Optional. Service Directory will reject values outside of [0, 65535].
	Port int32 `protobuf:"varint,3,opt,name=port,proto3" json:"port,omitempty"`
	// Optional. Metadata for the endpoint. This data can be consumed by service
	// clients.  The entire metadata dictionary may contain up to 512 characters,
	// spread accoss all key-value pairs. Metadata that goes beyond any these
	// limits will be rejected.
	Metadata             map[string]string `protobuf:"bytes,4,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

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

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

var xxx_messageInfo_Endpoint proto.InternalMessageInfo

func (m *Endpoint) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Endpoint) GetAddress() string {
	if m != nil {
		return m.Address
	}
	return ""
}

func (m *Endpoint) GetPort() int32 {
	if m != nil {
		return m.Port
	}
	return 0
}

func (m *Endpoint) GetMetadata() map[string]string {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func init() {
	proto.RegisterType((*Endpoint)(nil), "google.cloud.servicedirectory.v1beta1.Endpoint")
	proto.RegisterMapType((map[string]string)(nil), "google.cloud.servicedirectory.v1beta1.Endpoint.MetadataEntry")
}

func init() {
	proto.RegisterFile("google/cloud/servicedirectory/v1beta1/endpoint.proto", fileDescriptor_b682dd88b410ee12)
}

var fileDescriptor_b682dd88b410ee12 = []byte{
	// 401 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x41, 0x8b, 0xd4, 0x30,
	0x18, 0x25, 0xdb, 0x1d, 0x5d, 0x23, 0x0b, 0x52, 0x04, 0xeb, 0xa0, 0x38, 0x08, 0x42, 0xbd, 0x24,
	0xac, 0x7a, 0x90, 0x5d, 0x3c, 0xec, 0xc0, 0x1e, 0x85, 0xa5, 0xe0, 0xc5, 0x83, 0x92, 0x49, 0xbf,
	0xad, 0xd1, 0x36, 0x5f, 0x49, 0x32, 0x85, 0xa1, 0xf4, 0x47, 0xe8, 0x61, 0x7e, 0x9f, 0x67, 0x7f,
	0x81, 0x47, 0x69, 0x93, 0xd6, 0x71, 0x3c, 0xec, 0xdc, 0x5e, 0xbf, 0xd7, 0xf7, 0x78, 0xdf, 0xcb,
	0x47, 0xdf, 0x14, 0x88, 0x45, 0x09, 0x5c, 0x96, 0xb8, 0xce, 0xb9, 0x05, 0xd3, 0x28, 0x09, 0xb9,
	0x32, 0x20, 0x1d, 0x9a, 0x0d, 0x6f, 0xce, 0x56, 0xe0, 0xc4, 0x19, 0x07, 0x9d, 0xd7, 0xa8, 0xb4,
	0x63, 0xb5, 0x41, 0x87, 0xf1, 0x0b, 0xaf, 0x62, 0x83, 0x8a, 0xed, 0xab, 0x58, 0x50, 0xcd, 0x9f,
	0x05, 0x73, 0x51, 0x2b, 0x7e, 0xa3, 0xa0, 0xcc, 0x3f, 0xaf, 0xe0, 0x8b, 0x68, 0x14, 0x1a, 0xef,
	0x33, 0x7f, 0xbc, 0xf3, 0x83, 0x01, 0x8b, 0x6b, 0x23, 0x21, 0x50, 0x4f, 0x76, 0x28, 0xa1, 0x35,
	0x3a, 0xe1, 0x14, 0x6a, 0xeb, 0xd9, 0xe7, 0xdf, 0x23, 0x7a, 0x72, 0x15, 0x32, 0xc5, 0x8f, 0xe8,
	0xb1, 0x16, 0x15, 0x24, 0x64, 0x41, 0xd2, 0x7b, 0xcb, 0xe8, 0xe7, 0xe5, 0x2c, 0x1b, 0x06, 0xf1,
	0x53, 0x7a, 0x57, 0xe4, 0xb9, 0x01, 0x6b, 0x93, 0xa3, 0x91, 0x23, 0xd9, 0x38, 0xeb, 0x75, 0x35,
	0x1a, 0x97, 0x44, 0x0b, 0x92, 0xce, 0x3c, 0x37, 0x0c, 0xe2, 0x4f, 0xf4, 0xa4, 0x02, 0x27, 0x72,
	0xe1, 0x44, 0x72, 0xbc, 0x88, 0xd2, 0xfb, 0xaf, 0xde, 0xb1, 0x83, 0x36, 0x66, 0x63, 0x26, 0xf6,
	0x3e, 0xe8, 0xaf, 0xb4, 0x33, 0x1b, 0xef, 0x3d, 0x79, 0xce, 0x2f, 0xe8, 0xe9, 0x3f, 0x7c, 0xfc,
	0x80, 0x46, 0xdf, 0x60, 0xe3, 0x17, 0xc8, 0x7a, 0x18, 0x3f, 0xa4, 0xb3, 0x46, 0x94, 0x6b, 0xf0,
	0xc1, 0x33, 0xff, 0x71, 0x7e, 0xf4, 0x96, 0x9c, 0x6f, 0xc9, 0xaf, 0xcb, 0x1f, 0x84, 0xa6, 0xff,
	0x65, 0xf0, 0x09, 0x45, 0xad, 0x2c, 0x93, 0x58, 0xf1, 0xa9, 0x9e, 0x9b, 0xda, 0xe0, 0x57, 0x90,
	0xce, 0xf2, 0x36, 0xa0, 0x8e, 0x97, 0x28, 0x7d, 0x9f, 0xbc, 0x1d, 0x61, 0xc7, 0xfb, 0xce, 0x6c,
	0x2d, 0x24, 0x58, 0xde, 0x4e, 0xb8, 0x1b, 0x8f, 0xc2, 0xf2, 0x36, 0xa0, 0x6e, 0x3a, 0x07, 0xcb,
	0xdb, 0x11, 0x76, 0xcb, 0x2d, 0xa1, 0x2f, 0x25, 0x56, 0x87, 0x35, 0xb5, 0x3c, 0x1d, 0xf3, 0x5d,
	0xf7, 0x0f, 0x7a, 0x4d, 0x3e, 0x7e, 0x08, 0xba, 0x02, 0x4b, 0xa1, 0x0b, 0x86, 0xa6, 0xe0, 0x05,
	0xe8, 0xe1, 0xb9, 0xf9, 0xdf, 0xd5, 0x6e, 0x39, 0xd4, 0x8b, 0x7d, 0xe2, 0x37, 0x21, 0xab, 0x3b,
	0x83, 0xc9, 0xeb, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x87, 0x47, 0xb3, 0x0b, 0xec, 0x02, 0x00,
	0x00,
}
