// Copyright 2019 The Chromium OS Authors. All rights reserved.
// 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.25.0-devel
// 	protoc        v3.6.1
// source: lab/chromeos_device_id.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)
)

type ChromeOSDeviceID struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A unique ID for chromeos device, a randomly generated uuid or AssetTag.
	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*ChromeOSDeviceID) ProtoMessage() {}

func (x *ChromeOSDeviceID) ProtoReflect() protoreflect.Message {
	mi := &file_lab_chromeos_device_id_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 ChromeOSDeviceID.ProtoReflect.Descriptor instead.
func (*ChromeOSDeviceID) Descriptor() ([]byte, []int) {
	return file_lab_chromeos_device_id_proto_rawDescGZIP(), []int{0}
}

func (x *ChromeOSDeviceID) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

var File_lab_chromeos_device_id_proto protoreflect.FileDescriptor

var file_lab_chromeos_device_id_proto_rawDesc = []byte{
	0x0a, 0x1c, 0x6c, 0x61, 0x62, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x5f, 0x64,
	0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03,
	0x6c, 0x61, 0x62, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x44,
	0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x44, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 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_chromeos_device_id_proto_rawDescOnce sync.Once
	file_lab_chromeos_device_id_proto_rawDescData = file_lab_chromeos_device_id_proto_rawDesc
)

func file_lab_chromeos_device_id_proto_rawDescGZIP() []byte {
	file_lab_chromeos_device_id_proto_rawDescOnce.Do(func() {
		file_lab_chromeos_device_id_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_chromeos_device_id_proto_rawDescData)
	})
	return file_lab_chromeos_device_id_proto_rawDescData
}

var file_lab_chromeos_device_id_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_chromeos_device_id_proto_goTypes = []interface{}{
	(*ChromeOSDeviceID)(nil), // 0: lab.ChromeOSDeviceID
}
var file_lab_chromeos_device_id_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_chromeos_device_id_proto_init() }
func file_lab_chromeos_device_id_proto_init() {
	if File_lab_chromeos_device_id_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_chromeos_device_id_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ChromeOSDeviceID); 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_chromeos_device_id_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_chromeos_device_id_proto_goTypes,
		DependencyIndexes: file_lab_chromeos_device_id_proto_depIdxs,
		MessageInfos:      file_lab_chromeos_device_id_proto_msgTypes,
	}.Build()
	File_lab_chromeos_device_id_proto = out.File
	file_lab_chromeos_device_id_proto_rawDesc = nil
	file_lab_chromeos_device_id_proto_goTypes = nil
	file_lab_chromeos_device_id_proto_depIdxs = nil
}
