// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/client.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// 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

// Client concept represents an end-user infra service that users interact with
// directly. e.g: CQ, Release testing.
// ClientId proto and companion protos are used for two purposes:
//   1) Coordinate configs across different internal sub services to achieve a
//      certain property that's required by the end-user infra service.
//   2) Provide useful analytics of how the sub-services operate to fullfill
//      requests from the end-user infra services.
//
//
//
//
//    ---------------    1:N    -----------
//    |   Client    | <---------| Profile |  // Use for coordinate
//    ---------------           -----------  // behavioral configs
//
type Client struct {
	Name                 string    `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Id                   *ClientId `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

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

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

var xxx_messageInfo_Client proto.InternalMessageInfo

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

func (m *Client) GetId() *ClientId {
	if m != nil {
		return m.Id
	}
	return nil
}

func init() {
	proto.RegisterType((*Client)(nil), "prototype.Client")
}

func init() { proto.RegisterFile("prototype/client.proto", fileDescriptor_044aceac6e7a229c) }

var fileDescriptor_044aceac6e7a229c = []byte{
	// 151 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2b, 0x28, 0xca, 0x2f,
	0xc9, 0x2f, 0xa9, 0x2c, 0x48, 0xd5, 0x4f, 0xce, 0xc9, 0x4c, 0xcd, 0x2b, 0xd1, 0x03, 0x0b, 0x08,
	0x71, 0xc2, 0xc5, 0xa5, 0x24, 0xd1, 0x95, 0xc4, 0x67, 0xa6, 0x40, 0x54, 0x29, 0x39, 0x72, 0xb1,
	0x39, 0x83, 0x85, 0x84, 0x84, 0xb8, 0x58, 0xf2, 0x12, 0x73, 0x53, 0x25, 0x18, 0x15, 0x18, 0x35,
	0x38, 0x83, 0xc0, 0x6c, 0x21, 0x65, 0x2e, 0xa6, 0xcc, 0x14, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x6e,
	0x23, 0x61, 0x3d, 0xb8, 0x29, 0x7a, 0x10, 0x2d, 0x9e, 0x29, 0x41, 0x4c, 0x99, 0x29, 0x4e, 0xa6,
	0x51, 0xc6, 0xe9, 0xf9, 0x7a, 0xc9, 0x19, 0x45, 0xf9, 0xb9, 0x99, 0xa5, 0xb9, 0x7a, 0xf9, 0x45,
	0xe9, 0xfa, 0x30, 0x4e, 0x7e, 0xb1, 0x7e, 0x66, 0x5e, 0x5a, 0x51, 0xa2, 0x3e, 0x58, 0xab, 0x7e,
	0x7a, 0xbe, 0x3e, 0xdc, 0x8c, 0x24, 0x36, 0x30, 0xd3, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x34,
	0xb1, 0x21, 0xab, 0xc0, 0x00, 0x00, 0x00,
}
