// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/skylab_local_state/receive.proto

package skylab_local_state

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

// ReceiveRequest defines the input of `skylab_local_state receive`.
type ReceiveRequest struct {
	// The path to the directory where host info file(s) will be placed. It will
	// be created it if does not exist yet.
	ResultsDir           string   `protobuf:"bytes,1,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	MessageCount         int32    `protobuf:"varint,2,opt,name=message_count,json=messageCount,proto3" json:"message_count,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReceiveRequest proto.InternalMessageInfo

func (m *ReceiveRequest) GetResultsDir() string {
	if m != nil {
		return m.ResultsDir
	}
	return ""
}

func (m *ReceiveRequest) GetMessageCount() int32 {
	if m != nil {
		return m.MessageCount
	}
	return 0
}

// ReceiveResponse defines the output of `skylab_local_state receive`.
type ReceiveResponse struct {
	ReceivedMessages     int32    `protobuf:"varint,1,opt,name=received_messages,json=receivedMessages,proto3" json:"received_messages,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReceiveResponse proto.InternalMessageInfo

func (m *ReceiveResponse) GetReceivedMessages() int32 {
	if m != nil {
		return m.ReceivedMessages
	}
	return 0
}

func init() {
	proto.RegisterType((*ReceiveRequest)(nil), "test_platform.skylab_local_state.ReceiveRequest")
	proto.RegisterType((*ReceiveResponse)(nil), "test_platform.skylab_local_state.ReceiveResponse")
}

func init() {
	proto.RegisterFile("test_platform/skylab_local_state/receive.proto", fileDescriptor_e79e196b4b875a66)
}

var fileDescriptor_e79e196b4b875a66 = []byte{
	// 222 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0x3f, 0x4b, 0x04, 0x31,
	0x10, 0x47, 0x59, 0xe1, 0x04, 0xe3, 0xff, 0xad, 0xae, 0x73, 0x39, 0x9b, 0x03, 0x21, 0x29, 0xec,
	0x2d, 0xd4, 0x4a, 0xb4, 0x49, 0x61, 0x61, 0x13, 0x72, 0x7b, 0x73, 0x31, 0x98, 0xec, 0xac, 0x33,
	0x13, 0xc1, 0x6f, 0x2f, 0xae, 0x39, 0x41, 0x2c, 0xae, 0x9c, 0x37, 0x6f, 0x7e, 0xcc, 0x8c, 0xd2,
	0x02, 0x2c, 0x6e, 0x4c, 0x5e, 0x36, 0x48, 0xd9, 0xf0, 0xdb, 0x67, 0xf2, 0x2b, 0x97, 0xb0, 0xf7,
	0xc9, 0xb1, 0x78, 0x01, 0x43, 0xd0, 0x43, 0xfc, 0x00, 0x3d, 0x12, 0x0a, 0xb6, 0xdd, 0x1f, 0x5f,
	0xff, 0xf7, 0x17, 0xcf, 0xea, 0xc4, 0xfe, 0x8c, 0x58, 0x78, 0x2f, 0xc0, 0xd2, 0x5e, 0xa8, 0x43,
	0x02, 0x2e, 0x49, 0xd8, 0xad, 0x23, 0xcd, 0x9b, 0xae, 0x59, 0x1e, 0x58, 0x55, 0xd1, 0x7d, 0xa4,
	0xf6, 0x52, 0x1d, 0x67, 0x60, 0xf6, 0x01, 0x5c, 0x8f, 0x65, 0x90, 0xf9, 0x5e, 0xd7, 0x2c, 0x67,
	0xf6, 0xa8, 0xc2, 0xbb, 0x6f, 0xb6, 0xb8, 0x51, 0xa7, 0xbf, 0xb9, 0x3c, 0xe2, 0xc0, 0xd0, 0x5e,
	0xa9, 0xf3, 0xba, 0xdd, 0xda, 0x55, 0x97, 0xa7, 0xf8, 0x99, 0x3d, 0xdb, 0x36, 0x9e, 0x2a, 0xbf,
	0x7d, 0x7c, 0x79, 0x08, 0xa8, 0xfb, 0x57, 0xc2, 0x1c, 0x4b, 0xd6, 0x48, 0xc1, 0x6c, 0x0b, 0x64,
	0x13, 0x87, 0x0d, 0x79, 0x33, 0xdd, 0x68, 0x02, 0x9a, 0x5d, 0x5f, 0x59, 0xed, 0x4f, 0xea, 0xf5,
	0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3c, 0xdc, 0x40, 0x67, 0x40, 0x01, 0x00, 0x00,
}
