// Code generated by protoc-gen-go. DO NOT EDIT.
// source: relui.proto

package protos

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

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

type TaskStatus int32

const (
	TaskStatus_TASK_STATUS_UNKNOWN TaskStatus = 0
	TaskStatus_TASK_STATUS_CREATED TaskStatus = 1
	TaskStatus_TASK_STATUS_STARTED TaskStatus = 2
)

var TaskStatus_name = map[int32]string{
	0: "TASK_STATUS_UNKNOWN",
	1: "TASK_STATUS_CREATED",
	2: "TASK_STATUS_STARTED",
}

var TaskStatus_value = map[string]int32{
	"TASK_STATUS_UNKNOWN": 0,
	"TASK_STATUS_CREATED": 1,
	"TASK_STATUS_STARTED": 2,
}

func (x TaskStatus) String() string {
	return proto.EnumName(TaskStatus_name, int32(x))
}

func (TaskStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_6de8859f82adce0a, []int{0}
}

type Workflow struct {
	// name is a unique name for a workflow, such as local_go_release. The name must be unique across
	// all workflow configurations.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// buildable_asks is a list of tasks to be performed by the workflow.
	BuildableTasks []*BuildableTask `protobuf:"bytes,2,rep,name=buildable_tasks,json=buildableTasks,proto3" json:"buildable_tasks,omitempty"`
	// git_source is an optional configuration for which git source to fetch.
	GitSource *GitSource `protobuf:"bytes,3,opt,name=git_source,json=gitSource,proto3" json:"git_source,omitempty"`
	// id is a unique identifier generated by relui when a workflow is created.
	Id                   string   `protobuf:"bytes,4,opt,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Workflow proto.InternalMessageInfo

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

func (m *Workflow) GetBuildableTasks() []*BuildableTask {
	if m != nil {
		return m.BuildableTasks
	}
	return nil
}

func (m *Workflow) GetGitSource() *GitSource {
	if m != nil {
		return m.GitSource
	}
	return nil
}

func (m *Workflow) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

type BuildableTask struct {
	// name is a unique name for a task, such as fetch_go_source. The name must be unique across
	// all workflow configurations.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// depends_on is the name of a task this task depends on. Artifacts from the depends_on task will be available
	// to this task.
	DependsOn string `protobuf:"bytes,2,opt,name=depends_on,json=dependsOn,proto3" json:"depends_on,omitempty"`
	// task_status is the current status of a task.
	Status TaskStatus `protobuf:"varint,3,opt,name=status,proto3,enum=protos.TaskStatus" json:"status,omitempty"`
	// artifact_url is an optional URL to an artifact published by this task.
	ArtifactUrl string `protobuf:"bytes,4,opt,name=artifact_url,json=artifactUrl,proto3" json:"artifact_url,omitempty"`
	// git_source is an optional configuration for which git source to fetch.
	GitSource *GitSource `protobuf:"bytes,5,opt,name=git_source,json=gitSource,proto3" json:"git_source,omitempty"`
	// task_type is a unique type for a task, such as FetchGerritSource. Types are used by task runners to identify
	// how to execute a task.
	TaskType string `protobuf:"bytes,6,opt,name=task_type,json=taskType,proto3" json:"task_type,omitempty"`
	// id is a unique identifier generated by relui when a buildable task is created.
	Id                   string   `protobuf:"bytes,7,opt,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BuildableTask) Reset()         { *m = BuildableTask{} }
func (m *BuildableTask) String() string { return proto.CompactTextString(m) }
func (*BuildableTask) ProtoMessage()    {}
func (*BuildableTask) Descriptor() ([]byte, []int) {
	return fileDescriptor_6de8859f82adce0a, []int{1}
}

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

var xxx_messageInfo_BuildableTask proto.InternalMessageInfo

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

func (m *BuildableTask) GetDependsOn() string {
	if m != nil {
		return m.DependsOn
	}
	return ""
}

func (m *BuildableTask) GetStatus() TaskStatus {
	if m != nil {
		return m.Status
	}
	return TaskStatus_TASK_STATUS_UNKNOWN
}

func (m *BuildableTask) GetArtifactUrl() string {
	if m != nil {
		return m.ArtifactUrl
	}
	return ""
}

func (m *BuildableTask) GetGitSource() *GitSource {
	if m != nil {
		return m.GitSource
	}
	return nil
}

func (m *BuildableTask) GetTaskType() string {
	if m != nil {
		return m.TaskType
	}
	return ""
}

func (m *BuildableTask) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

// StartBuildableTaskRequest is a message sent to workers to start working on a BuildableTask for a Workflow.
type StartBuildableTaskRequest struct {
	// workflow_id is the workflow to which the BuildableTask belongs.
	WorkflowId string `protobuf:"bytes,1,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"`
	// buildable_task_id is the id of the BuildableTask to be started.
	BuildableTaskId string `protobuf:"bytes,2,opt,name=buildable_task_id,json=buildableTaskId,proto3" json:"buildable_task_id,omitempty"`
	// buildable_task_type is the type of the BuildableTask to be started.
	BuildableTaskType    string   `protobuf:"bytes,3,opt,name=buildable_task_type,json=buildableTaskType,proto3" json:"buildable_task_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *StartBuildableTaskRequest) Reset()         { *m = StartBuildableTaskRequest{} }
func (m *StartBuildableTaskRequest) String() string { return proto.CompactTextString(m) }
func (*StartBuildableTaskRequest) ProtoMessage()    {}
func (*StartBuildableTaskRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_6de8859f82adce0a, []int{2}
}

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

var xxx_messageInfo_StartBuildableTaskRequest proto.InternalMessageInfo

func (m *StartBuildableTaskRequest) GetWorkflowId() string {
	if m != nil {
		return m.WorkflowId
	}
	return ""
}

func (m *StartBuildableTaskRequest) GetBuildableTaskId() string {
	if m != nil {
		return m.BuildableTaskId
	}
	return ""
}

func (m *StartBuildableTaskRequest) GetBuildableTaskType() string {
	if m != nil {
		return m.BuildableTaskType
	}
	return ""
}

// LocalStorage is the persisted data of relui. It is used in development mode for saving application state.
type LocalStorage struct {
	// workflows are a list of user-created workflows.
	Workflows            []*Workflow `protobuf:"bytes,1,rep,name=workflows,proto3" json:"workflows,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

func (m *LocalStorage) Reset()         { *m = LocalStorage{} }
func (m *LocalStorage) String() string { return proto.CompactTextString(m) }
func (*LocalStorage) ProtoMessage()    {}
func (*LocalStorage) Descriptor() ([]byte, []int) {
	return fileDescriptor_6de8859f82adce0a, []int{3}
}

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

var xxx_messageInfo_LocalStorage proto.InternalMessageInfo

func (m *LocalStorage) GetWorkflows() []*Workflow {
	if m != nil {
		return m.Workflows
	}
	return nil
}

type GitSource struct {
	Url                  string   `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	Ref                  string   `protobuf:"bytes,2,opt,name=ref,proto3" json:"ref,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GitSource) Reset()         { *m = GitSource{} }
func (m *GitSource) String() string { return proto.CompactTextString(m) }
func (*GitSource) ProtoMessage()    {}
func (*GitSource) Descriptor() ([]byte, []int) {
	return fileDescriptor_6de8859f82adce0a, []int{4}
}

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

var xxx_messageInfo_GitSource proto.InternalMessageInfo

func (m *GitSource) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *GitSource) GetRef() string {
	if m != nil {
		return m.Ref
	}
	return ""
}

func init() {
	proto.RegisterEnum("protos.TaskStatus", TaskStatus_name, TaskStatus_value)
	proto.RegisterType((*Workflow)(nil), "protos.Workflow")
	proto.RegisterType((*BuildableTask)(nil), "protos.BuildableTask")
	proto.RegisterType((*StartBuildableTaskRequest)(nil), "protos.StartBuildableTaskRequest")
	proto.RegisterType((*LocalStorage)(nil), "protos.LocalStorage")
	proto.RegisterType((*GitSource)(nil), "protos.GitSource")
}

func init() { proto.RegisterFile("relui.proto", fileDescriptor_6de8859f82adce0a) }

var fileDescriptor_6de8859f82adce0a = []byte{
	// 434 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0xd1, 0x6e, 0xd3, 0x30,
	0x14, 0xc5, 0xe9, 0x28, 0xcb, 0xcd, 0xe8, 0x5a, 0x4f, 0x88, 0x20, 0x84, 0x28, 0x7d, 0xaa, 0xfa,
	0x50, 0x50, 0x79, 0x9f, 0x54, 0x60, 0x42, 0xd3, 0x50, 0x27, 0xc5, 0xa9, 0xfa, 0x68, 0xb9, 0xb5,
	0x5b, 0x59, 0x0d, 0x75, 0xb1, 0x1d, 0x4d, 0xfb, 0x13, 0x1e, 0xf9, 0x44, 0x3e, 0x01, 0xd9, 0x89,
	0x37, 0x12, 0xf1, 0xc0, 0x53, 0x6e, 0xee, 0x39, 0xb9, 0x3e, 0xe7, 0x5c, 0x07, 0x12, 0x2d, 0x8a,
	0x52, 0x4e, 0x8f, 0x5a, 0x59, 0x85, 0xbb, 0xfe, 0x61, 0x46, 0xbf, 0x10, 0x9c, 0xae, 0x94, 0xde,
	0x6f, 0x0b, 0x75, 0x87, 0x31, 0x9c, 0x1c, 0xd8, 0x77, 0x91, 0xa2, 0x21, 0x1a, 0xc7, 0x99, 0xaf,
	0xf1, 0x25, 0x9c, 0xaf, 0x4b, 0x59, 0x70, 0xb6, 0x2e, 0x04, 0xb5, 0xcc, 0xec, 0x4d, 0x1a, 0x0d,
	0x3b, 0xe3, 0x64, 0xf6, 0xa2, 0x9a, 0x64, 0xa6, 0x9f, 0x02, 0x9c, 0x33, 0xb3, 0xcf, 0x7a, 0xeb,
	0xbf, 0x5f, 0x0d, 0xfe, 0x00, 0xb0, 0x93, 0x96, 0x1a, 0x55, 0xea, 0x8d, 0x48, 0x3b, 0x43, 0x34,
	0x4e, 0x66, 0x83, 0xf0, 0xe9, 0x57, 0x69, 0x89, 0x07, 0xb2, 0x78, 0x17, 0x4a, 0xdc, 0x83, 0x48,
	0xf2, 0xf4, 0xc4, 0x6b, 0x88, 0x24, 0x1f, 0xfd, 0x46, 0xf0, 0xbc, 0x71, 0xc6, 0x3f, 0x75, 0xbe,
	0x01, 0xe0, 0xe2, 0x28, 0x0e, 0xdc, 0x50, 0x75, 0x48, 0x23, 0x8f, 0xc4, 0x75, 0xe7, 0xf6, 0x80,
	0x27, 0xd0, 0x35, 0x96, 0xd9, 0xd2, 0x78, 0x09, 0xbd, 0x19, 0x0e, 0x12, 0xdc, 0x40, 0xe2, 0x91,
	0xac, 0x66, 0xe0, 0x77, 0x70, 0xc6, 0xb4, 0x95, 0x5b, 0xb6, 0xb1, 0xb4, 0xd4, 0x45, 0x2d, 0x25,
	0x09, 0xbd, 0xa5, 0x2e, 0x5a, 0xae, 0x9e, 0xfe, 0x87, 0xab, 0xd7, 0x10, 0xbb, 0xf4, 0xa8, 0xbd,
	0x3f, 0x8a, 0xb4, 0xeb, 0x27, 0x9e, 0xba, 0x46, 0x7e, 0x7f, 0x0c, 0x96, 0x9f, 0x3d, 0x58, 0xfe,
	0x89, 0xe0, 0x15, 0xb1, 0x4c, 0xdb, 0x66, 0xb6, 0xe2, 0x47, 0x29, 0x8c, 0xc5, 0x6f, 0x21, 0xb9,
	0xab, 0x57, 0x46, 0x25, 0xaf, 0x53, 0x80, 0xd0, 0xba, 0xe6, 0x78, 0x02, 0x83, 0xe6, 0xce, 0x1c,
	0xad, 0x8a, 0xe4, 0xbc, 0xb1, 0x9e, 0x6b, 0x8e, 0xa7, 0x70, 0xd1, 0xe2, 0x7a, 0x85, 0x1d, 0xcf,
	0x1e, 0x34, 0xd8, 0x4e, 0xea, 0xe8, 0x12, 0xce, 0xbe, 0xa9, 0x0d, 0x2b, 0x88, 0x55, 0x9a, 0xed,
	0x04, 0x9e, 0x42, 0x1c, 0x4e, 0x36, 0x29, 0xf2, 0x37, 0xa3, 0x1f, 0x82, 0x08, 0x17, 0x2b, 0x7b,
	0xa4, 0x8c, 0xde, 0x43, 0xfc, 0x90, 0x0f, 0xee, 0x43, 0xc7, 0x05, 0x5c, 0x39, 0x70, 0xa5, 0xeb,
	0x68, 0xb1, 0xad, 0xc5, 0xba, 0x72, 0xb2, 0x02, 0x78, 0xdc, 0x11, 0x7e, 0x09, 0x17, 0xf9, 0x9c,
	0xdc, 0x50, 0x92, 0xcf, 0xf3, 0x25, 0xa1, 0xcb, 0xc5, 0xcd, 0xe2, 0x76, 0xb5, 0xe8, 0x3f, 0x69,
	0x03, 0x9f, 0xb3, 0xab, 0x79, 0x7e, 0xf5, 0xa5, 0x8f, 0xda, 0x00, 0xc9, 0xe7, 0x99, 0x03, 0xa2,
	0x75, 0xf5, 0x0b, 0x7c, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0xa6, 0xee, 0x56, 0xcb, 0x18, 0x03,
	0x00, 0x00,
}
