// Copyright 2019 Google LLC.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/cloud/securitycenter/v1p1beta1/run_asset_discovery_response.proto

package securitycenter

import (
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	duration "github.com/golang/protobuf/ptypes/duration"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

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

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// The state of an asset discovery run.
type RunAssetDiscoveryResponse_State int32

const (
	// Asset discovery run state was unspecified.
	RunAssetDiscoveryResponse_STATE_UNSPECIFIED RunAssetDiscoveryResponse_State = 0
	// Asset discovery run completed successfully.
	RunAssetDiscoveryResponse_COMPLETED RunAssetDiscoveryResponse_State = 1
	// Asset discovery run was cancelled with tasks still pending, as another
	// run for the same organization was started with a higher priority.
	RunAssetDiscoveryResponse_SUPERSEDED RunAssetDiscoveryResponse_State = 2
	// Asset discovery run was killed and terminated.
	RunAssetDiscoveryResponse_TERMINATED RunAssetDiscoveryResponse_State = 3
)

// Enum value maps for RunAssetDiscoveryResponse_State.
var (
	RunAssetDiscoveryResponse_State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		1: "COMPLETED",
		2: "SUPERSEDED",
		3: "TERMINATED",
	}
	RunAssetDiscoveryResponse_State_value = map[string]int32{
		"STATE_UNSPECIFIED": 0,
		"COMPLETED":         1,
		"SUPERSEDED":        2,
		"TERMINATED":        3,
	}
)

func (x RunAssetDiscoveryResponse_State) Enum() *RunAssetDiscoveryResponse_State {
	p := new(RunAssetDiscoveryResponse_State)
	*p = x
	return p
}

func (x RunAssetDiscoveryResponse_State) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (RunAssetDiscoveryResponse_State) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_enumTypes[0].Descriptor()
}

func (RunAssetDiscoveryResponse_State) Type() protoreflect.EnumType {
	return &file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_enumTypes[0]
}

func (x RunAssetDiscoveryResponse_State) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use RunAssetDiscoveryResponse_State.Descriptor instead.
func (RunAssetDiscoveryResponse_State) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescGZIP(), []int{0, 0}
}

// Response of asset discovery run
type RunAssetDiscoveryResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The state of an asset discovery run.
	State RunAssetDiscoveryResponse_State `protobuf:"varint,1,opt,name=state,proto3,enum=google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse_State" json:"state,omitempty"`
	// The duration between asset discovery run start and end
	Duration *duration.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"`
}

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

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

func (*RunAssetDiscoveryResponse) ProtoMessage() {}

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

func (x *RunAssetDiscoveryResponse) GetState() RunAssetDiscoveryResponse_State {
	if x != nil {
		return x.State
	}
	return RunAssetDiscoveryResponse_STATE_UNSPECIFIED
}

func (x *RunAssetDiscoveryResponse) GetDuration() *duration.Duration {
	if x != nil {
		return x.Duration
	}
	return nil
}

var File_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto protoreflect.FileDescriptor

var file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDesc = []byte{
	0x0a, 0x48, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x73,
	0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31,
	0x70, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x72, 0x75, 0x6e, 0x5f, 0x61, 0x73, 0x73, 0x65,
	0x74, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x25, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74,
	0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x70, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x31, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,
	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0xff, 0x01, 0x0a, 0x19, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x69, 0x73, 0x63,
	0x6f, 0x76, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a,
	0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x46, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x73, 0x65, 0x63, 0x75,
	0x72, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x70, 0x31, 0x62,
	0x65, 0x74, 0x61, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x44, 0x69, 0x73,
	0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53,
	0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64,
	0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
	0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x22, 0x4d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53,
	0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10,
	0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x50, 0x45, 0x52, 0x53, 0x45, 0x44, 0x45, 0x44, 0x10,
	0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10,
	0x03, 0x42, 0xfd, 0x01, 0x0a, 0x29, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x63,
	0x65, 0x6e, 0x74, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x70, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x50,
	0x01, 0x5a, 0x53, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x73,
	0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x2f, 0x76, 0x31,
	0x70, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79,
	0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0xaa, 0x02, 0x25, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x43, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x65,
	0x6e, 0x74, 0x65, 0x72, 0x2e, 0x56, 0x31, 0x50, 0x31, 0x42, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02,
	0x25, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x5c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x5c, 0x53, 0x65,
	0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x5c, 0x56, 0x31, 0x70,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xea, 0x02, 0x28, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x3a,
	0x3a, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x3a, 0x3a, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79,
	0x43, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x31, 0x70, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescOnce sync.Once
	file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescData = file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDesc
)

func file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescGZIP() []byte {
	file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescOnce.Do(func() {
		file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescData)
	})
	return file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDescData
}

var file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_goTypes = []interface{}{
	(RunAssetDiscoveryResponse_State)(0), // 0: google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse.State
	(*RunAssetDiscoveryResponse)(nil),    // 1: google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse
	(*duration.Duration)(nil),            // 2: google.protobuf.Duration
}
var file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_depIdxs = []int32{
	0, // 0: google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse.state:type_name -> google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse.State
	2, // 1: google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse.duration:type_name -> google.protobuf.Duration
	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_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_init() }
func file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_init() {
	if File_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RunAssetDiscoveryResponse); 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_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_goTypes,
		DependencyIndexes: file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_depIdxs,
		EnumInfos:         file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_enumTypes,
		MessageInfos:      file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_msgTypes,
	}.Build()
	File_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto = out.File
	file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_rawDesc = nil
	file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_goTypes = nil
	file_google_cloud_securitycenter_v1p1beta1_run_asset_discovery_response_proto_depIdxs = nil
}
