// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.32.0
// 	protoc        v3.21.12
// source: louhi.proto

package louhi

import (
	reflect "reflect"
	sync "sync"

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

// EventSource describes the source of a Notification.
type EventSource int32

const (
	EventSource_PIPELINE EventSource = 0
	EventSource_STAGE    EventSource = 1
)

// Enum value maps for EventSource.
var (
	EventSource_name = map[int32]string{
		0: "PIPELINE",
		1: "STAGE",
	}
	EventSource_value = map[string]int32{
		"PIPELINE": 0,
		"STAGE":    1,
	}
)

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

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

func (EventSource) Descriptor() protoreflect.EnumDescriptor {
	return file_louhi_proto_enumTypes[0].Descriptor()
}

func (EventSource) Type() protoreflect.EnumType {
	return &file_louhi_proto_enumTypes[0]
}

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

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

// EventAction describes the action which generated a Notification.
type EventAction int32

const (
	EventAction_STARTED          EventAction = 0
	EventAction_FINISHED         EventAction = 1
	EventAction_FAILED           EventAction = 2
	EventAction_CREATED_ARTIFACT EventAction = 3
)

// Enum value maps for EventAction.
var (
	EventAction_name = map[int32]string{
		0: "STARTED",
		1: "FINISHED",
		2: "FAILED",
		3: "CREATED_ARTIFACT",
	}
	EventAction_value = map[string]int32{
		"STARTED":          0,
		"FINISHED":         1,
		"FAILED":           2,
		"CREATED_ARTIFACT": 3,
	}
)

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

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

func (EventAction) Descriptor() protoreflect.EnumDescriptor {
	return file_louhi_proto_enumTypes[1].Descriptor()
}

func (EventAction) Type() protoreflect.EnumType {
	return &file_louhi_proto_enumTypes[1]
}

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

// Deprecated: Use EventAction.Descriptor instead.
func (EventAction) EnumDescriptor() ([]byte, []int) {
	return file_louhi_proto_rawDescGZIP(), []int{1}
}

// Notification describes a PubSub notification from Louhi.
type Notification struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	ProjectId           string      `protobuf:"bytes,1,opt,name=project_id,json=projectId,proto3" json:"project_id,omitempty"`
	FlowUniqueKey       string      `protobuf:"bytes,2,opt,name=flow_unique_key,json=flowUniqueKey,proto3" json:"flow_unique_key,omitempty"`
	FlowName            string      `protobuf:"bytes,3,opt,name=flow_name,json=flowName,proto3" json:"flow_name,omitempty"`
	PipelineExecutionId string      `protobuf:"bytes,4,opt,name=pipeline_execution_id,json=pipelineExecutionId,proto3" json:"pipeline_execution_id,omitempty"`
	EventSource         EventSource `protobuf:"varint,5,opt,name=event_source,json=eventSource,proto3,enum=louhi.EventSource" json:"event_source,omitempty"`
	EventAction         EventAction `protobuf:"varint,6,opt,name=event_action,json=eventAction,proto3,enum=louhi.EventAction" json:"event_action,omitempty"`
	Link                string      `protobuf:"bytes,7,opt,name=link,proto3" json:"link,omitempty"`
	Branch              string      `protobuf:"bytes,8,opt,name=branch,proto3" json:"branch,omitempty"`
	RefSha              string      `protobuf:"bytes,9,opt,name=ref_sha,json=refSha,proto3" json:"ref_sha,omitempty"`
	// We'd really prefer an enum for trigger_type, but the values don't follow
	// a consistent format, eg. "MANUAL" and "cron-trigger", the latter of which
	// is not a valid enum value.
	TriggerType  string   `protobuf:"bytes,10,opt,name=trigger_type,json=triggerType,proto3" json:"trigger_type,omitempty"`
	StartedBy    string   `protobuf:"bytes,11,opt,name=started_by,json=startedBy,proto3" json:"started_by,omitempty"`
	ArtifactLink []string `protobuf:"bytes,12,rep,name=artifact_link,json=artifactLink,proto3" json:"artifact_link,omitempty"`
	GeneratedCls []string `protobuf:"bytes,13,rep,name=generated_cls,json=generatedCls,proto3" json:"generated_cls,omitempty"`
}

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

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

func (*Notification) ProtoMessage() {}

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

func (x *Notification) GetProjectId() string {
	if x != nil {
		return x.ProjectId
	}
	return ""
}

func (x *Notification) GetFlowUniqueKey() string {
	if x != nil {
		return x.FlowUniqueKey
	}
	return ""
}

func (x *Notification) GetFlowName() string {
	if x != nil {
		return x.FlowName
	}
	return ""
}

func (x *Notification) GetPipelineExecutionId() string {
	if x != nil {
		return x.PipelineExecutionId
	}
	return ""
}

func (x *Notification) GetEventSource() EventSource {
	if x != nil {
		return x.EventSource
	}
	return EventSource_PIPELINE
}

func (x *Notification) GetEventAction() EventAction {
	if x != nil {
		return x.EventAction
	}
	return EventAction_STARTED
}

func (x *Notification) GetLink() string {
	if x != nil {
		return x.Link
	}
	return ""
}

func (x *Notification) GetBranch() string {
	if x != nil {
		return x.Branch
	}
	return ""
}

func (x *Notification) GetRefSha() string {
	if x != nil {
		return x.RefSha
	}
	return ""
}

func (x *Notification) GetTriggerType() string {
	if x != nil {
		return x.TriggerType
	}
	return ""
}

func (x *Notification) GetStartedBy() string {
	if x != nil {
		return x.StartedBy
	}
	return ""
}

func (x *Notification) GetArtifactLink() []string {
	if x != nil {
		return x.ArtifactLink
	}
	return nil
}

func (x *Notification) GetGeneratedCls() []string {
	if x != nil {
		return x.GeneratedCls
	}
	return nil
}

var File_louhi_proto protoreflect.FileDescriptor

var file_louhi_proto_rawDesc = []byte{
	0x0a, 0x0b, 0x6c, 0x6f, 0x75, 0x68, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6c,
	0x6f, 0x75, 0x68, 0x69, 0x22, 0xe5, 0x03, 0x0a, 0x0c, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
	0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65,
	0x63, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x75, 0x6e, 0x69,
	0x71, 0x75, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66,
	0x6c, 0x6f, 0x77, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1b, 0x0a, 0x09,
	0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x08, 0x66, 0x6c, 0x6f, 0x77, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x69, 0x70,
	0x65, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f,
	0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x70, 0x69, 0x70, 0x65, 0x6c, 0x69,
	0x6e, 0x65, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x35, 0x0a,
	0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x05, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x75, 0x68, 0x69, 0x2e, 0x45, 0x76, 0x65, 0x6e,
	0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0b, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f,
	0x75, 0x72, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x0c, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x63,
	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x75,
	0x68, 0x69, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b,
	0x65, 0x76, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6c,
	0x69, 0x6e, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x6b, 0x12,
	0x16, 0x0a, 0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52,
	0x06, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x5f, 0x73,
	0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x66, 0x53, 0x68, 0x61,
	0x12, 0x21, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65,
	0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x62,
	0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64,
	0x42, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x5f, 0x6c,
	0x69, 0x6e, 0x6b, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x72, 0x74, 0x69, 0x66,
	0x61, 0x63, 0x74, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72,
	0x61, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c,
	0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x43, 0x6c, 0x73, 0x2a, 0x26, 0x0a, 0x0b,
	0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x50,
	0x49, 0x50, 0x45, 0x4c, 0x49, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x54, 0x41,
	0x47, 0x45, 0x10, 0x01, 0x2a, 0x4a, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x74,
	0x69, 0x6f, 0x6e, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x0c, 0x0a, 0x08, 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a,
	0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x52,
	0x45, 0x41, 0x54, 0x45, 0x44, 0x5f, 0x41, 0x52, 0x54, 0x49, 0x46, 0x41, 0x43, 0x54, 0x10, 0x03,
	0x42, 0x2a, 0x5a, 0x28, 0x67, 0x6f, 0x2e, 0x73, 0x6b, 0x69, 0x61, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
	0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x6c, 0x6f, 0x75, 0x68, 0x69, 0x2d, 0x77, 0x61, 0x74, 0x63,
	0x68, 0x65, 0x72, 0x2f, 0x67, 0x6f, 0x2f, 0x6c, 0x6f, 0x75, 0x68, 0x69, 0x62, 0x06, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_louhi_proto_rawDescOnce sync.Once
	file_louhi_proto_rawDescData = file_louhi_proto_rawDesc
)

func file_louhi_proto_rawDescGZIP() []byte {
	file_louhi_proto_rawDescOnce.Do(func() {
		file_louhi_proto_rawDescData = protoimpl.X.CompressGZIP(file_louhi_proto_rawDescData)
	})
	return file_louhi_proto_rawDescData
}

var file_louhi_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_louhi_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_louhi_proto_goTypes = []interface{}{
	(EventSource)(0),     // 0: louhi.EventSource
	(EventAction)(0),     // 1: louhi.EventAction
	(*Notification)(nil), // 2: louhi.Notification
}
var file_louhi_proto_depIdxs = []int32{
	0, // 0: louhi.Notification.event_source:type_name -> louhi.EventSource
	1, // 1: louhi.Notification.event_action:type_name -> louhi.EventAction
	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_louhi_proto_init() }
func file_louhi_proto_init() {
	if File_louhi_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_louhi_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Notification); 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_louhi_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_louhi_proto_goTypes,
		DependencyIndexes: file_louhi_proto_depIdxs,
		EnumInfos:         file_louhi_proto_enumTypes,
		MessageInfos:      file_louhi_proto_msgTypes,
	}.Build()
	File_louhi_proto = out.File
	file_louhi_proto_rawDesc = nil
	file_louhi_proto_goTypes = nil
	file_louhi_proto_depIdxs = nil
}
