// 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.27.1
// 	protoc        v3.17.1
// source: lab_platform/stable_version_key.proto

package lab_platform

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	device "go.chromium.org/chromiumos/infra/proto/go/device"
	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)
)

// Next Tag: 3
type StableVersionKey struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	ModelId     *device.ModelId         `protobuf:"bytes,1,opt,name=model_id,json=modelId,proto3" json:"model_id,omitempty"`
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,2,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
}

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

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

func (*StableVersionKey) ProtoMessage() {}

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

func (x *StableVersionKey) GetModelId() *device.ModelId {
	if x != nil {
		return x.ModelId
	}
	return nil
}

func (x *StableVersionKey) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

var File_lab_platform_stable_version_key_proto protoreflect.FileDescriptor

var file_lab_platform_stable_version_key_proto_rawDesc = []byte{
	0x0a, 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, 0x12, 0x0c, 0x6c, 0x61, 0x62, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15,
	0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x7a, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x56,
	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x08, 0x6d, 0x6f, 0x64,
	0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x64, 0x65,
	0x76, 0x69, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x52, 0x07, 0x6d, 0x6f,
	0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74,
	0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61,
	0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65,
	0x74, 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_version_key_proto_rawDescOnce sync.Once
	file_lab_platform_stable_version_key_proto_rawDescData = file_lab_platform_stable_version_key_proto_rawDesc
)

func file_lab_platform_stable_version_key_proto_rawDescGZIP() []byte {
	file_lab_platform_stable_version_key_proto_rawDescOnce.Do(func() {
		file_lab_platform_stable_version_key_proto_rawDescData = protoimpl.X.CompressGZIP(file_lab_platform_stable_version_key_proto_rawDescData)
	})
	return file_lab_platform_stable_version_key_proto_rawDescData
}

var file_lab_platform_stable_version_key_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_lab_platform_stable_version_key_proto_goTypes = []interface{}{
	(*StableVersionKey)(nil),       // 0: lab_platform.StableVersionKey
	(*device.ModelId)(nil),         // 1: device.ModelId
	(*chromiumos.BuildTarget)(nil), // 2: chromiumos.BuildTarget
}
var file_lab_platform_stable_version_key_proto_depIdxs = []int32{
	1, // 0: lab_platform.StableVersionKey.model_id:type_name -> device.ModelId
	2, // 1: lab_platform.StableVersionKey.build_target:type_name -> chromiumos.BuildTarget
	2, // [2:2] is the sub-list for method output_type
	2, // [2:2] is the sub-list for method input_type
	2, // [2:2] is the sub-list for extension type_name
	2, // [2:2] is the sub-list for extension extendee
	0, // [0:2] is the sub-list for field type_name
}

func init() { file_lab_platform_stable_version_key_proto_init() }
func file_lab_platform_stable_version_key_proto_init() {
	if File_lab_platform_stable_version_key_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_lab_platform_stable_version_key_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*StableVersionKey); 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_version_key_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_lab_platform_stable_version_key_proto_goTypes,
		DependencyIndexes: file_lab_platform_stable_version_key_proto_depIdxs,
		MessageInfos:      file_lab_platform_stable_version_key_proto_msgTypes,
	}.Build()
	File_lab_platform_stable_version_key_proto = out.File
	file_lab_platform_stable_version_key_proto_rawDesc = nil
	file_lab_platform_stable_version_key_proto_goTypes = nil
	file_lab_platform_stable_version_key_proto_depIdxs = nil
}
