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

package securitycenter

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "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

// Cloud SCC's Notification
type NotificationMessage struct {
	// Name of the notification config that generated current notification.
	NotificationConfigName string `protobuf:"bytes,1,opt,name=notification_config_name,json=notificationConfigName,proto3" json:"notification_config_name,omitempty"`
	// Notification Event.
	//
	// Types that are valid to be assigned to Event:
	//	*NotificationMessage_Finding
	Event                isNotificationMessage_Event `protobuf_oneof:"event"`
	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
	XXX_unrecognized     []byte                      `json:"-"`
	XXX_sizecache        int32                       `json:"-"`
}

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

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

var xxx_messageInfo_NotificationMessage proto.InternalMessageInfo

func (m *NotificationMessage) GetNotificationConfigName() string {
	if m != nil {
		return m.NotificationConfigName
	}
	return ""
}

type isNotificationMessage_Event interface {
	isNotificationMessage_Event()
}

type NotificationMessage_Finding struct {
	Finding *Finding `protobuf:"bytes,2,opt,name=finding,proto3,oneof"`
}

func (*NotificationMessage_Finding) isNotificationMessage_Event() {}

func (m *NotificationMessage) GetEvent() isNotificationMessage_Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *NotificationMessage) GetFinding() *Finding {
	if x, ok := m.GetEvent().(*NotificationMessage_Finding); ok {
		return x.Finding
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*NotificationMessage) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*NotificationMessage_Finding)(nil),
	}
}

func init() {
	proto.RegisterType((*NotificationMessage)(nil), "google.cloud.securitycenter.v1.NotificationMessage")
}

func init() {
	proto.RegisterFile("google/cloud/securitycenter/v1/notification_message.proto", fileDescriptor_63db66f0787c1bb5)
}

var fileDescriptor_63db66f0787c1bb5 = []byte{
	// 310 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x90, 0xc1, 0x4a, 0x33, 0x31,
	0x14, 0x85, 0xff, 0x14, 0x7e, 0x8b, 0x71, 0x57, 0x41, 0x86, 0x22, 0xa5, 0x76, 0x63, 0x17, 0x92,
	0x30, 0xba, 0xd1, 0xb8, 0xeb, 0x80, 0xba, 0xd0, 0x52, 0x2a, 0x74, 0x21, 0x85, 0x12, 0xd3, 0x34,
	0x04, 0x66, 0xee, 0x1d, 0x66, 0xd2, 0x01, 0x1f, 0xc6, 0x17, 0xf0, 0x51, 0x7c, 0x14, 0xd7, 0x3e,
	0x80, 0x98, 0x4c, 0xa1, 0x03, 0x6a, 0xb7, 0x39, 0xdf, 0x39, 0xf7, 0x9c, 0xd0, 0x2b, 0x83, 0x68,
	0x52, 0xcd, 0x55, 0x8a, 0xeb, 0x25, 0x2f, 0xb5, 0x5a, 0x17, 0xd6, 0xbd, 0x28, 0x0d, 0x4e, 0x17,
	0xbc, 0x8a, 0x39, 0xa0, 0xb3, 0x2b, 0xab, 0xa4, 0xb3, 0x08, 0x8b, 0x4c, 0x97, 0xa5, 0x34, 0x9a,
	0xe5, 0x05, 0x3a, 0xec, 0xf4, 0x82, 0x95, 0x79, 0x2b, 0x6b, 0x5a, 0x59, 0x15, 0x77, 0x8f, 0xeb,
	0x68, 0x99, 0x5b, 0x2e, 0x01, 0xd0, 0xf9, 0x90, 0x32, 0xb8, 0xbb, 0x67, 0x3b, 0x0e, 0xaf, 0x2c,
	0x2c, 0x2d, 0x98, 0x40, 0x0f, 0x5e, 0x09, 0x3d, 0x1c, 0x6f, 0x55, 0x79, 0x08, 0x4d, 0x3a, 0x97,
	0x34, 0x6a, 0x34, 0x54, 0x08, 0x2b, 0x6b, 0x16, 0x20, 0x33, 0x1d, 0x91, 0x3e, 0x19, 0xee, 0x4f,
	0x8f, 0xb6, 0xf5, 0xc4, 0xcb, 0x63, 0x99, 0xe9, 0x4e, 0x42, 0xdb, 0xf5, 0x89, 0xa8, 0xd5, 0x27,
	0xc3, 0x83, 0xf3, 0x53, 0xf6, 0xf7, 0x1e, 0x76, 0x13, 0xf0, 0xbb, 0x7f, 0xd3, 0x8d, 0x73, 0xd4,
	0xa6, 0xff, 0x75, 0xa5, 0xc1, 0x8d, 0x3e, 0x09, 0x1d, 0x28, 0xcc, 0x76, 0x44, 0x8c, 0xa2, 0x1f,
	0x36, 0x4c, 0xbe, 0x07, 0x4e, 0xc8, 0xd3, 0x7d, 0xed, 0x35, 0x98, 0x4a, 0x30, 0x0c, 0x0b, 0xc3,
	0x8d, 0x06, 0x3f, 0x9f, 0x07, 0x49, 0xe6, 0xb6, 0xfc, 0xed, 0xbf, 0xae, 0x9b, 0x2f, 0x6f, 0xad,
	0xde, 0x6d, 0x88, 0x4b, 0x7c, 0x95, 0xc7, 0x5a, 0x4d, 0x42, 0x95, 0x59, 0xfc, 0xbe, 0x01, 0xe6,
	0x1e, 0x98, 0x37, 0x81, 0xf9, 0x2c, 0xfe, 0x68, 0x9d, 0x04, 0x40, 0x08, 0x4f, 0x08, 0xd1, 0x44,
	0x84, 0x98, 0xc5, 0xcf, 0x7b, 0xbe, 0xde, 0xc5, 0x57, 0x00, 0x00, 0x00, 0xff, 0xff, 0xda, 0x1f,
	0xf5, 0x40, 0x46, 0x02, 0x00, 0x00,
}
