// Copyright 2021 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: chromiumos/sdk_cache_state.proto

package chromiumos

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

// Stores information about the cached SDK.
type SdkCacheState struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The SDK version. See crbug.com/1023855.
	Version int32 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"`
	// The manifest branch.
	ManifestBranch string `protobuf:"bytes,2,opt,name=manifest_branch,json=manifestBranch,proto3" json:"manifest_branch,omitempty"`
	// The manifest URL.
	ManifestUrl string `protobuf:"bytes,3,opt,name=manifest_url,json=manifestUrl,proto3" json:"manifest_url,omitempty"`
	// The git hash of the snapshot.
	SnapshotHash string `protobuf:"bytes,4,opt,name=snapshot_hash,json=snapshotHash,proto3" json:"snapshot_hash,omitempty"`
}

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

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

func (*SdkCacheState) ProtoMessage() {}

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

func (x *SdkCacheState) GetVersion() int32 {
	if x != nil {
		return x.Version
	}
	return 0
}

func (x *SdkCacheState) GetManifestBranch() string {
	if x != nil {
		return x.ManifestBranch
	}
	return ""
}

func (x *SdkCacheState) GetManifestUrl() string {
	if x != nil {
		return x.ManifestUrl
	}
	return ""
}

func (x *SdkCacheState) GetSnapshotHash() string {
	if x != nil {
		return x.SnapshotHash
	}
	return ""
}

var File_chromiumos_sdk_cache_state_proto protoreflect.FileDescriptor

var file_chromiumos_sdk_cache_state_proto_rawDesc = []byte{
	0x0a, 0x20, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x73, 0x64, 0x6b,
	0x5f, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f,
	0x74, 0x6f, 0x12, 0x0a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x22, 0x9a,
	0x01, 0x0a, 0x0d, 0x53, 0x64, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65,
	0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6d, 0x61,
	0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x42, 0x72, 0x61,
	0x6e, 0x63, 0x68, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f,
	0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x6e, 0x69, 0x66,
	0x65, 0x73, 0x74, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68,
	0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73,
	0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x42, 0x36, 0x5a, 0x34, 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, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_sdk_cache_state_proto_rawDescOnce sync.Once
	file_chromiumos_sdk_cache_state_proto_rawDescData = file_chromiumos_sdk_cache_state_proto_rawDesc
)

func file_chromiumos_sdk_cache_state_proto_rawDescGZIP() []byte {
	file_chromiumos_sdk_cache_state_proto_rawDescOnce.Do(func() {
		file_chromiumos_sdk_cache_state_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_sdk_cache_state_proto_rawDescData)
	})
	return file_chromiumos_sdk_cache_state_proto_rawDescData
}

var file_chromiumos_sdk_cache_state_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_chromiumos_sdk_cache_state_proto_goTypes = []interface{}{
	(*SdkCacheState)(nil), // 0: chromiumos.SdkCacheState
}
var file_chromiumos_sdk_cache_state_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_chromiumos_sdk_cache_state_proto_init() }
func file_chromiumos_sdk_cache_state_proto_init() {
	if File_chromiumos_sdk_cache_state_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_sdk_cache_state_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SdkCacheState); 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_chromiumos_sdk_cache_state_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_sdk_cache_state_proto_goTypes,
		DependencyIndexes: file_chromiumos_sdk_cache_state_proto_depIdxs,
		MessageInfos:      file_chromiumos_sdk_cache_state_proto_msgTypes,
	}.Build()
	File_chromiumos_sdk_cache_state_proto = out.File
	file_chromiumos_sdk_cache_state_proto_rawDesc = nil
	file_chromiumos_sdk_cache_state_proto_goTypes = nil
	file_chromiumos_sdk_cache_state_proto_depIdxs = nil
}
