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

// StableFirmwareVersion is an association between a given ChromeOS version
// and a string uniquely identifying the firmware version.
// next tag: 4
type StableFirmwareVersion 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"`
	// A fragment of the Google Storage location for a firmware image.
	// The motivating use case is the devserver API as of 2021 Q1.
	//
	// e.g. "SOMEBOARD-firmware/R80-14444.333.0", which maps to
	// gs://some-bucket/[[image]]/name-of-firmware-bundle.tgz .
	//
	// This fragment can be consumed by the devserver API and permits
	// users to download an firmware bundle without downloading
	// the entire OS image that it is part of.
	Image string `protobuf:"bytes,3,opt,name=image,proto3" json:"image,omitempty"`
}

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

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

func (*StableFirmwareVersion) ProtoMessage() {}

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

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

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

func (x *StableFirmwareVersion) GetImage() string {
	if x != nil {
		return x.Image
	}
	return ""
}

var File_lab_platform_stable_firmware_version_proto protoreflect.FileDescriptor

var file_lab_platform_stable_firmware_version_proto_rawDesc = []byte{
	0x0a, 0x2a, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73,
	0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 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, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x46, 0x69, 0x72, 0x6d, 0x77,
	0x61, 0x72, 0x65, 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, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 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_firmware_version_proto_rawDescOnce sync.Once
	file_lab_platform_stable_firmware_version_proto_rawDescData = file_lab_platform_stable_firmware_version_proto_rawDesc
)

func file_lab_platform_stable_firmware_version_proto_rawDescGZIP() []byte {
	file_lab_platform_stable_firmware_version_proto_rawDescOnce.Do(func() {
		file_lab_platform_stable_firmware_version_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_platform_stable_firmware_version_proto_rawDescData)
	})
	return file_lab_platform_stable_firmware_version_proto_rawDescData
}

var file_lab_platform_stable_firmware_version_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_platform_stable_firmware_version_proto_goTypes = []interface{}{
	(*StableFirmwareVersion)(nil), // 0: lab_platform.StableFirmwareVersion
	(*StableVersionKey)(nil),      // 1: lab_platform.StableVersionKey
}
var file_lab_platform_stable_firmware_version_proto_depIdxs = []int32{
	1, // 0: lab_platform.StableFirmwareVersion.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_firmware_version_proto_init() }
func file_lab_platform_stable_firmware_version_proto_init() {
	if File_lab_platform_stable_firmware_version_proto != nil {
		return
	}
	file_lab_platform_stable_version_key_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_lab_platform_stable_firmware_version_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StableFirmwareVersion); 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_firmware_version_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_platform_stable_firmware_version_proto_goTypes,
		DependencyIndexes: file_lab_platform_stable_firmware_version_proto_depIdxs,
		MessageInfos:      file_lab_platform_stable_firmware_version_proto_msgTypes,
	}.Build()
	File_lab_platform_stable_firmware_version_proto = out.File
	file_lab_platform_stable_firmware_version_proto_rawDesc = nil
	file_lab_platform_stable_firmware_version_proto_goTypes = nil
	file_lab_platform_stable_firmware_version_proto_depIdxs = nil
}
