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

// FaftVersion is an association between a given ChromeOS version
// and a string uniquely identifying the faft firmware version.
// next tag: 3
type StableFaftVersion 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 *StableFaftVersion) Reset() {
	*x = StableFaftVersion{}
	if protoimpl.UnsafeEnabled {
		mi := &file_lab_platform_stable_faft_version_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*StableFaftVersion) ProtoMessage() {}

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

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

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

var File_lab_platform_stable_faft_version_proto protoreflect.FileDescriptor

var file_lab_platform_stable_faft_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, 0x66, 0x61, 0x66, 0x74, 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, 0x46, 0x61, 0x66, 0x74, 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_faft_version_proto_rawDescOnce sync.Once
	file_lab_platform_stable_faft_version_proto_rawDescData = file_lab_platform_stable_faft_version_proto_rawDesc
)

func file_lab_platform_stable_faft_version_proto_rawDescGZIP() []byte {
	file_lab_platform_stable_faft_version_proto_rawDescOnce.Do(func() {
		file_lab_platform_stable_faft_version_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_platform_stable_faft_version_proto_rawDescData)
	})
	return file_lab_platform_stable_faft_version_proto_rawDescData
}

var file_lab_platform_stable_faft_version_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_platform_stable_faft_version_proto_goTypes = []interface{}{
	(*StableFaftVersion)(nil), // 0: lab_platform.StableFaftVersion
	(*StableVersionKey)(nil),  // 1: lab_platform.StableVersionKey
}
var file_lab_platform_stable_faft_version_proto_depIdxs = []int32{
	1, // 0: lab_platform.StableFaftVersion.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_faft_version_proto_init() }
func file_lab_platform_stable_faft_version_proto_init() {
	if File_lab_platform_stable_faft_version_proto != nil {
		return
	}
	file_lab_platform_stable_version_key_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_lab_platform_stable_faft_version_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StableFaftVersion); 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_faft_version_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_platform_stable_faft_version_proto_goTypes,
		DependencyIndexes: file_lab_platform_stable_faft_version_proto_depIdxs,
		MessageInfos:      file_lab_platform_stable_faft_version_proto_msgTypes,
	}.Build()
	File_lab_platform_stable_faft_version_proto = out.File
	file_lab_platform_stable_faft_version_proto_rawDesc = nil
	file_lab_platform_stable_faft_version_proto_goTypes = nil
	file_lab_platform_stable_faft_version_proto_depIdxs = nil
}
