// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: lab/rpm.proto

package lab

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// Remote power management info.
// Next Tag: 3
type OSRPM struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	PowerunitName   string `protobuf:"bytes,1,opt,name=powerunit_name,json=powerunitName,proto3" json:"powerunit_name,omitempty"`
	PowerunitOutlet string `protobuf:"bytes,2,opt,name=powerunit_outlet,json=powerunitOutlet,proto3" json:"powerunit_outlet,omitempty"`
}

func (x *OSRPM) Reset() {
	*x = OSRPM{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_rpm_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *OSRPM) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*OSRPM) ProtoMessage() {}

func (x *OSRPM) ProtoReflect() protoreflect.Message {
	mi := &file_lab_rpm_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use OSRPM.ProtoReflect.Descriptor instead.
func (*OSRPM) Descriptor() ([]byte, []int) {
	return file_lab_rpm_proto_rawDescGZIP(), []int{0}
}

func (x *OSRPM) GetPowerunitName() string {
	if x != nil {
		return x.PowerunitName
	}
	return ""
}

func (x *OSRPM) GetPowerunitOutlet() string {
	if x != nil {
		return x.PowerunitOutlet
	}
	return ""
}

var File_lab_rpm_proto protoreflect.FileDescriptor

var file_lab_rpm_proto_rawDesc = []byte{
	0x0a, 0x0d, 0x6c, 0x61, 0x62, 0x2f, 0x72, 0x70, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
	0x03, 0x6c, 0x61, 0x62, 0x22, 0x59, 0x0a, 0x05, 0x4f, 0x53, 0x52, 0x50, 0x4d, 0x12, 0x25, 0x0a,
	0x0e, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6e, 0x69, 0x74,
	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x10, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6e, 0x69,
	0x74, 0x5f, 0x6f, 0x75, 0x74, 0x6c, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f,
	0x70, 0x6f, 0x77, 0x65, 0x72, 0x75, 0x6e, 0x69, 0x74, 0x4f, 0x75, 0x74, 0x6c, 0x65, 0x74, 0x42,
	0x2f, 0x5a, 0x2d, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f,
	0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e,
	0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x6c, 0x61, 0x62,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_lab_rpm_proto_rawDescOnce sync.Once
	file_lab_rpm_proto_rawDescData = file_lab_rpm_proto_rawDesc
)

func file_lab_rpm_proto_rawDescGZIP() []byte {
	file_lab_rpm_proto_rawDescOnce.Do(func() {
		file_lab_rpm_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_rpm_proto_rawDescData)
	})
	return file_lab_rpm_proto_rawDescData
}

var file_lab_rpm_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_rpm_proto_goTypes = []interface{}{
	(*OSRPM)(nil), // 0: lab.OSRPM
}
var file_lab_rpm_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_lab_rpm_proto_init() }
func file_lab_rpm_proto_init() {
	if File_lab_rpm_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_rpm_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*OSRPM); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_lab_rpm_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_rpm_proto_goTypes,
		DependencyIndexes: file_lab_rpm_proto_depIdxs,
		MessageInfos:      file_lab_rpm_proto_msgTypes,
	}.Build()
	File_lab_rpm_proto = out.File
	file_lab_rpm_proto_rawDesc = nil
	file_lab_rpm_proto_goTypes = nil
	file_lab_rpm_proto_depIdxs = nil
}
