// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/cloud/securitycenter/v1p1beta1/source.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 Security Command Center's (Cloud SCC) finding source. A finding source
// is an entity or a mechanism that can produce a finding. A source is like a
// container of findings that come from the same scanner, logger, monitor, etc.
type Source struct {
	// The relative resource name of this source. See:
	// https://cloud.google.com/apis/design/resource_names#relative_resource_name
	// Example:
	// "organizations/{organization_id}/sources/{source_id}"
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The source's display name.
	// A source's display name must be unique amongst its siblings, for example,
	// two sources with the same parent can't share the same display name.
	// The display name must have a length between 1 and 64 characters
	// (inclusive).
	DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
	// The description of the source (max of 1024 characters).
	// Example:
	// "Cloud Security Scanner is a web security scanner for common
	// vulnerabilities in App Engine applications. It can automatically
	// scan and detect four common vulnerabilities, including cross-site-scripting
	// (XSS), Flash injection, mixed content (HTTP in HTTPS), and
	// outdated/insecure libraries."
	Description          string   `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Source proto.InternalMessageInfo

func (m *Source) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Source) GetDisplayName() string {
	if m != nil {
		return m.DisplayName
	}
	return ""
}

func (m *Source) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

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

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

var fileDescriptor_96479ffd36eb78cb = []byte{
	// 324 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0x41, 0x4a, 0x03, 0x31,
	0x14, 0x86, 0x99, 0x2a, 0x05, 0x53, 0x57, 0xb3, 0xaa, 0xc5, 0x45, 0x15, 0x0b, 0x75, 0x61, 0xc2,
	0xe8, 0x2e, 0xae, 0x6c, 0x17, 0xee, 0xa4, 0x58, 0x2c, 0x22, 0x05, 0x49, 0xd3, 0x10, 0x02, 0xd3,
	0xbc, 0x21, 0x49, 0x85, 0x5a, 0x7a, 0x21, 0xaf, 0xe0, 0x0d, 0x3c, 0x4a, 0xef, 0x20, 0x48, 0x93,
	0xb4, 0x9d, 0x71, 0xa3, 0xbb, 0xcc, 0xfb, 0xbf, 0xff, 0x7f, 0x3f, 0x6f, 0xd0, 0xb5, 0x04, 0x90,
	0xb9, 0x20, 0x3c, 0x87, 0xf9, 0x94, 0x58, 0xc1, 0xe7, 0x46, 0xb9, 0x05, 0x17, 0xda, 0x09, 0x43,
	0xde, 0xb2, 0x22, 0x9b, 0x08, 0xc7, 0x32, 0x62, 0x61, 0x6e, 0xb8, 0xc0, 0x85, 0x01, 0x07, 0x69,
	0x27, 0x78, 0xb0, 0xf7, 0xe0, 0xaa, 0x07, 0xef, 0x3c, 0xad, 0xd3, 0x18, 0xcd, 0x0a, 0x45, 0x98,
	0xd6, 0xe0, 0x98, 0x53, 0xa0, 0x6d, 0x08, 0x69, 0x9d, 0x94, 0x54, 0x23, 0xca, 0xf9, 0xe7, 0x9f,
	0x09, 0xaa, 0x0f, 0xfd, 0x20, 0x4d, 0xd1, 0xa1, 0x66, 0x33, 0xd1, 0x4c, 0xda, 0x49, 0xf7, 0xe8,
	0xd1, 0xbf, 0xd3, 0x33, 0x74, 0x3c, 0x55, 0xb6, 0xc8, 0xd9, 0xe2, 0xd5, 0x6b, 0x35, 0xaf, 0x35,
	0xe2, 0xec, 0x61, 0x83, 0xb4, 0x51, 0x63, 0x2a, 0x2c, 0x37, 0xaa, 0xd8, 0xac, 0x6c, 0x1e, 0x44,
	0x62, 0x3f, 0xa2, 0xcf, 0xeb, 0xbb, 0x27, 0x74, 0xf1, 0xab, 0x7b, 0xa8, 0xc4, 0x0a, 0x65, 0x31,
	0x87, 0x19, 0x89, 0x1d, 0xae, 0xc0, 0x48, 0xa6, 0xd5, 0x7b, 0xa8, 0x4f, 0x96, 0xe5, 0xcf, 0x55,
	0xbc, 0x8c, 0x25, 0xcb, 0xf0, 0x58, 0xf5, 0xbe, 0x13, 0x74, 0xc9, 0x61, 0x86, 0xff, 0x75, 0xa4,
	0x41, 0xf2, 0x32, 0x8c, 0xa0, 0x84, 0x9c, 0x69, 0x89, 0xc1, 0x48, 0x22, 0x85, 0xf6, 0x97, 0x20,
	0xfb, 0x42, 0x7f, 0xfc, 0xa0, 0xdb, 0xaa, 0xf0, 0x51, 0xeb, 0xdc, 0x87, 0xd4, 0xbe, 0x5f, 0x3f,
	0x8c, 0x6a, 0x3f, 0xac, 0x1f, 0x65, 0x83, 0xac, 0xb7, 0xb1, 0x7d, 0x6d, 0xb9, 0xb1, 0xe7, 0xc6,
	0x55, 0x6e, 0x3c, 0xda, 0xc6, 0xaf, 0x6b, 0xdd, 0xc0, 0x51, 0xea, 0x41, 0x4a, 0xab, 0x24, 0xa5,
	0x3b, 0x74, 0x52, 0xf7, 0xd5, 0x6f, 0x7e, 0x02, 0x00, 0x00, 0xff, 0xff, 0xe6, 0xf2, 0xdb, 0x65,
	0x5a, 0x02, 0x00, 0x00,
}
