// 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_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
}
