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

package securitycenter

import (
	fmt "fmt"
	math "math"

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

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

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

var RunAssetDiscoveryResponse_State_name = map[int32]string{
	0: "STATE_UNSPECIFIED",
	1: "COMPLETED",
	2: "SUPERSEDED",
	3: "TERMINATED",
}

var RunAssetDiscoveryResponse_State_value = map[string]int32{
	"STATE_UNSPECIFIED": 0,
	"COMPLETED":         1,
	"SUPERSEDED":        2,
	"TERMINATED":        3,
}

func (x RunAssetDiscoveryResponse_State) String() string {
	return proto.EnumName(RunAssetDiscoveryResponse_State_name, int32(x))
}

func (RunAssetDiscoveryResponse_State) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_0b03e6253db5b9ec, []int{0, 0}
}

// Response of asset discovery run
type RunAssetDiscoveryResponse struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *RunAssetDiscoveryResponse) Reset()         { *m = RunAssetDiscoveryResponse{} }
func (m *RunAssetDiscoveryResponse) String() string { return proto.CompactTextString(m) }
func (*RunAssetDiscoveryResponse) ProtoMessage()    {}
func (*RunAssetDiscoveryResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_0b03e6253db5b9ec, []int{0}
}

func (m *RunAssetDiscoveryResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RunAssetDiscoveryResponse.Unmarshal(m, b)
}
func (m *RunAssetDiscoveryResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RunAssetDiscoveryResponse.Marshal(b, m, deterministic)
}
func (m *RunAssetDiscoveryResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RunAssetDiscoveryResponse.Merge(m, src)
}
func (m *RunAssetDiscoveryResponse) XXX_Size() int {
	return xxx_messageInfo_RunAssetDiscoveryResponse.Size(m)
}
func (m *RunAssetDiscoveryResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_RunAssetDiscoveryResponse.DiscardUnknown(m)
}

var xxx_messageInfo_RunAssetDiscoveryResponse proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterEnum("google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse_State", RunAssetDiscoveryResponse_State_name, RunAssetDiscoveryResponse_State_value)
	proto.RegisterType((*RunAssetDiscoveryResponse)(nil), "google.cloud.securitycenter.v1p1beta1.RunAssetDiscoveryResponse")
}

func init() {
	proto.RegisterFile("google/cloud/securitycenter/v1p1beta1/run_asset_discovery_response.proto", fileDescriptor_0b03e6253db5b9ec)
}

var fileDescriptor_0b03e6253db5b9ec = []byte{
	// 382 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xd1, 0xaa, 0xd3, 0x30,
	0x1c, 0xc6, 0x6d, 0xe5, 0x88, 0x46, 0x3c, 0xcc, 0x82, 0x70, 0x36, 0x44, 0xc6, 0x60, 0x30, 0x6f,
	0x12, 0x3a, 0xf1, 0xa6, 0x5e, 0x6d, 0x6d, 0xa6, 0x03, 0x37, 0x4b, 0xdb, 0xed, 0x42, 0x0a, 0x25,
	0xeb, 0x62, 0x29, 0xcc, 0xa4, 0x24, 0xe9, 0x60, 0xaf, 0xe4, 0xa3, 0xf8, 0x28, 0xbe, 0x83, 0x28,
	0x4d, 0xda, 0x41, 0x2f, 0xc4, 0x5d, 0xfe, 0xf9, 0x7e, 0xfd, 0x7d, 0x5f, 0x09, 0xf8, 0x54, 0x70,
	0x5e, 0x9c, 0x28, 0xca, 0x4f, 0xbc, 0x3e, 0x22, 0x49, 0xf3, 0x5a, 0x94, 0xea, 0x92, 0x53, 0xa6,
	0xa8, 0x40, 0x67, 0xb7, 0x72, 0x0f, 0x54, 0x11, 0x17, 0x89, 0x9a, 0x65, 0x44, 0x4a, 0xaa, 0xb2,
	0x63, 0x29, 0x73, 0x7e, 0xa6, 0xe2, 0x92, 0x09, 0x2a, 0x2b, 0xce, 0x24, 0x85, 0x95, 0xe0, 0x8a,
	0x3b, 0x53, 0x63, 0x82, 0xda, 0x04, 0xfb, 0x26, 0x78, 0x35, 0x8d, 0x5e, 0xb7, 0x85, 0xa4, 0x2a,
	0x11, 0x61, 0x8c, 0x2b, 0xa2, 0x4a, 0xce, 0xa4, 0x91, 0x8c, 0xde, 0xb4, 0xa9, 0xbe, 0x0e, 0xf5,
	0x37, 0x74, 0xac, 0x85, 0x06, 0x4c, 0x3e, 0xf9, 0x63, 0x81, 0x61, 0x54, 0xb3, 0x45, 0x33, 0x25,
	0xe8, 0x96, 0x44, 0xed, 0x10, 0x27, 0x05, 0x77, 0x52, 0x11, 0x45, 0x1f, 0xac, 0xb1, 0x35, 0xbb,
	0x9f, 0xaf, 0xe0, 0x4d, 0x93, 0xe0, 0x3f, 0x85, 0x30, 0x6e, 0x6c, 0x91, 0x91, 0x3a, 0xef, 0xc1,
	0xd3, 0x6e, 0xcd, 0x83, 0x3d, 0xb6, 0x66, 0xcf, 0xe7, 0xc3, 0xae, 0xa0, 0x9b, 0x0b, 0x83, 0x16,
	0x88, 0xae, 0xe8, 0x64, 0x03, 0xee, 0xb4, 0xc6, 0x79, 0x05, 0x5e, 0xc6, 0xc9, 0x22, 0xc1, 0xd9,
	0x6e, 0x1b, 0x87, 0xd8, 0x5f, 0xaf, 0xd6, 0x38, 0x18, 0x3c, 0x72, 0x5e, 0x80, 0x67, 0xfe, 0x97,
	0x4d, 0xf8, 0x19, 0x27, 0x38, 0x18, 0x58, 0xce, 0x3d, 0x00, 0xf1, 0x2e, 0xc4, 0x51, 0x8c, 0x03,
	0x1c, 0x0c, 0xec, 0xe6, 0x4e, 0x70, 0xb4, 0x59, 0x6f, 0x17, 0x4d, 0xfe, 0x78, 0xf9, 0xdb, 0x02,
	0x6f, 0x73, 0xfe, 0xfd, 0xb6, 0x5f, 0x0b, 0xad, 0xaf, 0x71, 0x0b, 0x16, 0xfc, 0x44, 0x58, 0x01,
	0xb9, 0x28, 0x50, 0x41, 0x99, 0x1e, 0x8c, 0x4c, 0x44, 0xaa, 0x52, 0xfe, 0xe7, 0xfd, 0x3f, 0xf4,
	0x83, 0x1f, 0xf6, 0xf4, 0xa3, 0xb1, 0xfa, 0xba, 0x3e, 0x6e, 0x53, 0xdf, 0xd4, 0xef, 0xdd, 0xd0,
	0x5d, 0x36, 0x9f, 0xfd, 0xec, 0xb8, 0x54, 0x73, 0x69, 0x9f, 0x4b, 0xf7, 0x9d, 0xfe, 0x97, 0x3d,
	0x33, 0x9c, 0xe7, 0x69, 0xd0, 0xf3, 0xfa, 0xa4, 0xe7, 0x5d, 0xd1, 0xc3, 0x13, 0x3d, 0xfd, 0xdd,
	0xdf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x49, 0xfd, 0xcf, 0xb9, 0x02, 0x00, 0x00,
}
