// Code generated by protoc-gen-go. DO NOT EDIT.
// source: reflection/grpc_testing/test.proto

package grpc_testing

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

type SearchResponse struct {
	Results              []*SearchResponse_Result `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

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

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

var xxx_messageInfo_SearchResponse proto.InternalMessageInfo

func (m *SearchResponse) GetResults() []*SearchResponse_Result {
	if m != nil {
		return m.Results
	}
	return nil
}

type SearchResponse_Result struct {
	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	Title                string   `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
	Snippets             []string `protobuf:"bytes,3,rep,name=snippets,proto3" json:"snippets,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SearchResponse_Result proto.InternalMessageInfo

func (m *SearchResponse_Result) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *SearchResponse_Result) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *SearchResponse_Result) GetSnippets() []string {
	if m != nil {
		return m.Snippets
	}
	return nil
}

type SearchRequest struct {
	Query                string   `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SearchRequest) Reset()         { *m = SearchRequest{} }
func (m *SearchRequest) String() string { return proto.CompactTextString(m) }
func (*SearchRequest) ProtoMessage()    {}
func (*SearchRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_b179ea967ba71047, []int{1}
}

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

var xxx_messageInfo_SearchRequest proto.InternalMessageInfo

func (m *SearchRequest) GetQuery() string {
	if m != nil {
		return m.Query
	}
	return ""
}

func init() {
	proto.RegisterType((*SearchResponse)(nil), "grpc.testing.SearchResponse")
	proto.RegisterType((*SearchResponse_Result)(nil), "grpc.testing.SearchResponse.Result")
	proto.RegisterType((*SearchRequest)(nil), "grpc.testing.SearchRequest")
}

func init() {
	proto.RegisterFile("reflection/grpc_testing/test.proto", fileDescriptor_b179ea967ba71047)
}

var fileDescriptor_b179ea967ba71047 = []byte{
	// 267 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x51, 0x3f, 0x4b, 0xfd, 0x30,
	0x14, 0x25, 0xbf, 0xf2, 0xab, 0xbe, 0xeb, 0x5f, 0x82, 0x43, 0xa9, 0x0e, 0xa5, 0x22, 0x74, 0x4a,
	0x1f, 0xcf, 0xd9, 0x45, 0x57, 0x07, 0x69, 0x37, 0x17, 0xa9, 0xe5, 0x1a, 0x03, 0x31, 0xe9, 0xbb,
	0xb9, 0x15, 0xfc, 0x30, 0xae, 0x7e, 0x4e, 0x69, 0xfb, 0x2a, 0x0a, 0xea, 0xe2, 0x94, 0x9c, 0x73,
	0xcf, 0x39, 0xc9, 0xe5, 0x40, 0x4e, 0xf8, 0x60, 0xb1, 0x65, 0xe3, 0x5d, 0xa9, 0xa9, 0x6b, 0xef,
	0x18, 0x03, 0x1b, 0xa7, 0xcb, 0xe1, 0x54, 0x1d, 0x79, 0xf6, 0x72, 0x77, 0x18, 0xa8, 0xcd, 0x20,
	0x7f, 0x15, 0xb0, 0x5f, 0x63, 0x43, 0xed, 0x63, 0x85, 0xa1, 0xf3, 0x2e, 0xa0, 0xbc, 0x80, 0x2d,
	0xc2, 0xd0, 0x5b, 0x0e, 0x89, 0xc8, 0xa2, 0x62, 0x67, 0x75, 0xaa, 0x3e, 0x5b, 0xd4, 0x57, 0xb9,
	0xaa, 0x46, 0x6d, 0x35, 0x7b, 0xd2, 0x6b, 0x88, 0x27, 0x4a, 0x1e, 0x42, 0xd4, 0x93, 0x4d, 0x44,
	0x26, 0x8a, 0x45, 0x35, 0x5c, 0xe5, 0x11, 0xfc, 0x67, 0xc3, 0x16, 0x93, 0x7f, 0x23, 0x37, 0x01,
	0x99, 0xc2, 0x76, 0x70, 0xa6, 0xeb, 0x90, 0x43, 0x12, 0x65, 0x51, 0xb1, 0xa8, 0x3e, 0x70, 0x7e,
	0x06, 0x7b, 0xf3, 0x7b, 0xeb, 0x1e, 0x03, 0x0f, 0x11, 0xeb, 0x1e, 0xe9, 0x65, 0x13, 0x3b, 0x81,
	0xd5, 0x9b, 0x98, 0x75, 0x35, 0xd2, 0xb3, 0x69, 0x51, 0x5e, 0x41, 0x3c, 0x11, 0xf2, 0xf8, 0xfb,
	0xef, 0x8f, 0x71, 0xe9, 0xc9, 0x6f, 0xbb, 0xc9, 0x1b, 0x38, 0xa8, 0x99, 0xb0, 0x79, 0x32, 0x4e,
	0xff, 0x39, 0xad, 0x10, 0x4b, 0x71, 0xb9, 0xbc, 0x55, 0xda, 0x7b, 0x6d, 0x51, 0x69, 0x6f, 0x1b,
	0xa7, 0x95, 0x27, 0x3d, 0x56, 0x55, 0xfe, 0x50, 0xdd, 0x7d, 0x3c, 0xd6, 0x76, 0xfe, 0x1e, 0x00,
	0x00, 0xff, 0xff, 0x38, 0x42, 0x3b, 0xd2, 0xdc, 0x01, 0x00, 0x00,
}
