// 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_platform/stable_cros_version.proto

package lab_platform

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)
)

// StableCrosVersion describes a ChromeOS version with a given stable version
// ID.
// next tag: 3
type StableCrosVersion struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Key     *StableVersionKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Version string            `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
}

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

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

func (*StableCrosVersion) ProtoMessage() {}

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

func (x *StableCrosVersion) GetKey() *StableVersionKey {
	if x != nil {
		return x.Key
	}
	return nil
}

func (x *StableCrosVersion) GetVersion() string {
	if x != nil {
		return x.Version
	}
	return ""
}

var File_lab_platform_stable_cros_version_proto protoreflect.FileDescriptor

var file_lab_platform_stable_cros_version_proto_rawDesc = []byte{
	0x0a, 0x26, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73,
	0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x72, 0x6f, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x25, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74,
	0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x5f, 0x0a,
	0x11, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x72, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x1e, 0x2e, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x53,
	0x74, 0x61, 0x62, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x52,
	0x03, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x38,
	0x5a, 0x36, 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, 0x5f,
	0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_lab_platform_stable_cros_version_proto_rawDescOnce sync.Once
	file_lab_platform_stable_cros_version_proto_rawDescData = file_lab_platform_stable_cros_version_proto_rawDesc
)

func file_lab_platform_stable_cros_version_proto_rawDescGZIP() []byte {
	file_lab_platform_stable_cros_version_proto_rawDescOnce.Do(func() {
		file_lab_platform_stable_cros_version_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_platform_stable_cros_version_proto_rawDescData)
	})
	return file_lab_platform_stable_cros_version_proto_rawDescData
}

var file_lab_platform_stable_cros_version_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_platform_stable_cros_version_proto_goTypes = []interface{}{
	(*StableCrosVersion)(nil), // 0: lab_platform.StableCrosVersion
	(*StableVersionKey)(nil),  // 1: lab_platform.StableVersionKey
}
var file_lab_platform_stable_cros_version_proto_depIdxs = []int32{
	1, // 0: lab_platform.StableCrosVersion.key:type_name -> lab_platform.StableVersionKey
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_lab_platform_stable_cros_version_proto_init() }
func file_lab_platform_stable_cros_version_proto_init() {
	if File_lab_platform_stable_cros_version_proto != nil {
		return
	}
	file_lab_platform_stable_version_key_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_lab_platform_stable_cros_version_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StableCrosVersion); 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_platform_stable_cros_version_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_platform_stable_cros_version_proto_goTypes,
		DependencyIndexes: file_lab_platform_stable_cros_version_proto_depIdxs,
		MessageInfos:      file_lab_platform_stable_cros_version_proto_msgTypes,
	}.Build()
	File_lab_platform_stable_cros_version_proto = out.File
	file_lab_platform_stable_cros_version_proto_rawDesc = nil
	file_lab_platform_stable_cros_version_proto_goTypes = nil
	file_lab_platform_stable_cros_version_proto_depIdxs = nil
}
