// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/skylab_local_state/serialize.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

// SerializeRequest defines the input of `skylab_local_state serialize`.
type SerializeRequest struct {
	// The name of the DUT whose host info will be serialized
	DutName string `protobuf:"bytes,1,opt,name=dut_name,json=dutName,proto3" json:"dut_name,omitempty"`
	// Path to the directory where host info sits
	ResultsDir           string   `protobuf:"bytes,2,opt,name=results_dir,json=resultsDir,proto3" json:"results_dir,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_SerializeRequest proto.InternalMessageInfo

func (m *SerializeRequest) GetDutName() string {
	if m != nil {
		return m.DutName
	}
	return ""
}

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

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

func init() {
	proto.RegisterFile("test_platform/skylab_local_state/serialize.proto", fileDescriptor_65e05ee0e2039fc1)
}

var fileDescriptor_65e05ee0e2039fc1 = []byte{
	// 190 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x8f, 0x3f, 0x4b, 0xc4, 0x40,
	0x10, 0xc5, 0x89, 0x85, 0x7f, 0xd6, 0x46, 0x52, 0xc5, 0xca, 0x60, 0x65, 0xb5, 0x2b, 0xf8, 0x0d,
	0xc4, 0x4a, 0x24, 0x45, 0xec, 0x6c, 0x96, 0x49, 0x32, 0x89, 0x8b, 0xbb, 0x99, 0x38, 0x33, 0x5b,
	0xdc, 0x7d, 0xfa, 0x83, 0x70, 0x29, 0x8e, 0x2b, 0xae, 0x7c, 0x7f, 0x7e, 0xf0, 0x9e, 0x79, 0x55,
	0x14, 0xf5, 0x4b, 0x04, 0x1d, 0x89, 0x93, 0x93, 0xbf, 0x5d, 0x84, 0xce, 0x47, 0xea, 0x21, 0x7a,
	0x51, 0x50, 0x74, 0x82, 0x1c, 0x20, 0x86, 0x3d, 0xda, 0x85, 0x49, 0xa9, 0xac, 0x4f, 0x08, 0x7b,
	0x4e, 0x3c, 0x37, 0xe6, 0xe1, 0x7b, 0x83, 0x5a, 0xfc, 0xcf, 0x28, 0x5a, 0x3e, 0x9a, 0xdb, 0x21,
	0xab, 0x9f, 0x21, 0x61, 0x55, 0xd4, 0xc5, 0xcb, 0x5d, 0x7b, 0x33, 0x64, 0x6d, 0x20, 0x61, 0xf9,
	0x64, 0xee, 0x19, 0x25, 0x47, 0x15, 0x3f, 0x04, 0xae, 0xae, 0xd6, 0xd4, 0x1c, 0xad, 0x8f, 0xc0,
	0xef, 0x5f, 0x3f, 0x9f, 0x13, 0xd9, 0xfe, 0x97, 0x29, 0x85, 0x9c, 0x2c, 0xf1, 0xe4, 0x36, 0x41,
	0xe2, 0xc2, 0x3c, 0x32, 0xb8, 0x75, 0x9b, 0x9b, 0xc8, 0x5d, 0xfa, 0xd3, 0x5d, 0xaf, 0xd5, 0xb7,
	0x43, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x81, 0x4c, 0x9b, 0xfa, 0x00, 0x00, 0x00,
}
