// 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"`
	// params are parameters provided when creating a workflow.
	Params map[string]string `protobuf:"bytes,3,rep,name=params,proto3" json:"params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// id is a unique identifier generated by relui when a workflow is created. Do not set.
	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) GetParams() map[string]string {
	if m != nil {
		return m.Params
	}
	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. Do not set.
	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 ""
}

// 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{2}
}

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{3}
}

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.RegisterMapType((map[string]string)(nil), "protos.Workflow.ParamsEntry")
	proto.RegisterType((*BuildableTask)(nil), "protos.BuildableTask")
	proto.RegisterType((*LocalStorage)(nil), "protos.LocalStorage")
	proto.RegisterType((*GitSource)(nil), "protos.GitSource")
}

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

var fileDescriptor_6de8859f82adce0a = []byte{
	// 426 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x4d, 0x8f, 0xd3, 0x30,
	0x10, 0xc5, 0xe9, 0x6e, 0xd9, 0x4c, 0x96, 0x52, 0x0c, 0x08, 0x8b, 0x0f, 0xa9, 0xf4, 0x54, 0xed,
	0xa1, 0xa0, 0xc2, 0x01, 0x38, 0xac, 0x54, 0xa0, 0xe2, 0xb0, 0xa8, 0x8b, 0x9c, 0x54, 0x3d, 0x46,
	0x6e, 0xe3, 0x56, 0x51, 0xbd, 0x71, 0x64, 0x3b, 0xac, 0xf2, 0x6b, 0xf9, 0x0b, 0xfc, 0x04, 0x64,
	0xd7, 0x66, 0x4b, 0xc5, 0x29, 0xe3, 0xf7, 0xc6, 0x2f, 0xf3, 0xde, 0x18, 0x12, 0xc5, 0x45, 0x53,
	0x8e, 0x6b, 0x25, 0x8d, 0xc4, 0x5d, 0xf7, 0xd1, 0xc3, 0x5f, 0x08, 0xce, 0x96, 0x52, 0xed, 0x36,
	0x42, 0xde, 0x62, 0x0c, 0x27, 0x15, 0xbb, 0xe1, 0x04, 0x0d, 0xd0, 0x28, 0xa6, 0xae, 0xc6, 0x97,
	0xf0, 0x70, 0xd5, 0x94, 0xa2, 0x60, 0x2b, 0xc1, 0x73, 0xc3, 0xf4, 0x4e, 0x93, 0x68, 0xd0, 0x19,
	0x25, 0x93, 0xa7, 0x7b, 0x25, 0x3d, 0xfe, 0x1c, 0xe8, 0x8c, 0xe9, 0x1d, 0xed, 0xad, 0x0e, 0x8f,
	0x1a, 0xbf, 0x87, 0x6e, 0xcd, 0x14, 0xbb, 0xd1, 0xa4, 0xe3, 0xae, 0xbd, 0x0c, 0xd7, 0xc2, 0x5f,
	0xc7, 0x3f, 0x1c, 0x3d, 0xab, 0x8c, 0x6a, 0xa9, 0xef, 0xc5, 0x3d, 0x88, 0xca, 0x82, 0x9c, 0xb8,
	0x39, 0xa2, 0xb2, 0x78, 0xfe, 0x11, 0x92, 0x83, 0x36, 0xdc, 0x87, 0xce, 0x8e, 0xb7, 0x7e, 0x4e,
	0x5b, 0xe2, 0x27, 0x70, 0xfa, 0x93, 0x89, 0x86, 0x93, 0xc8, 0x61, 0xfb, 0xc3, 0xa7, 0xe8, 0x03,
	0x1a, 0xfe, 0x46, 0xf0, 0xe0, 0x9f, 0x11, 0xff, 0x6b, 0xf3, 0x15, 0x40, 0xc1, 0x6b, 0x5e, 0x15,
	0x3a, 0x97, 0x95, 0x17, 0x89, 0x3d, 0x72, 0x5d, 0xe1, 0x0b, 0xe8, 0x6a, 0xc3, 0x4c, 0x63, 0x5d,
	0xa0, 0x51, 0x6f, 0x82, 0x83, 0x0b, 0x2b, 0x98, 0x3a, 0x86, 0xfa, 0x0e, 0xfc, 0x1a, 0xce, 0x99,
	0x32, 0xe5, 0x86, 0xad, 0x4d, 0xde, 0x28, 0xe1, 0x5d, 0x24, 0x01, 0x5b, 0x28, 0x81, 0xdf, 0x02,
	0x6c, 0x4b, 0x93, 0x6b, 0xd9, 0xa8, 0x35, 0x27, 0xa7, 0x03, 0x34, 0x4a, 0x26, 0x8f, 0x82, 0xe4,
	0xb7, 0xd2, 0xa4, 0x8e, 0xa0, 0xf1, 0x36, 0x94, 0xf8, 0x05, 0xc4, 0x36, 0xfc, 0xdc, 0xb4, 0x35,
	0x27, 0x5d, 0xa7, 0x78, 0x66, 0x81, 0xac, 0xad, 0xb9, 0x4f, 0xeb, 0x7e, 0x48, 0x6b, 0x78, 0x09,
	0xe7, 0xdf, 0xe5, 0x9a, 0x89, 0xd4, 0x48, 0xc5, 0xb6, 0x1c, 0x8f, 0x21, 0xbe, 0xf5, 0x69, 0x6b,
	0x82, 0xdc, 0x1a, 0xfa, 0xc7, 0x6b, 0xa0, 0x77, 0x2d, 0xc3, 0x37, 0x10, 0xff, 0x1d, 0xc2, 0x66,
	0x6d, 0x5d, 0xf8, 0xac, 0x1b, 0x25, 0x2c, 0xa2, 0xf8, 0xc6, 0x87, 0x64, 0xcb, 0x8b, 0x25, 0xc0,
	0x5d, 0x10, 0xf8, 0x19, 0x3c, 0xce, 0xa6, 0xe9, 0x55, 0x9e, 0x66, 0xd3, 0x6c, 0x91, 0xe6, 0x8b,
	0xf9, 0xd5, 0xfc, 0x7a, 0x39, 0xef, 0xdf, 0x3b, 0x26, 0xbe, 0xd0, 0xd9, 0x34, 0x9b, 0x7d, 0xed,
	0xa3, 0x63, 0x22, 0xcd, 0xa6, 0xd4, 0x12, 0xd1, 0x6a, 0xff, 0x4c, 0xdf, 0xfd, 0x09, 0x00, 0x00,
	0xff, 0xff, 0xa2, 0xed, 0x2b, 0x74, 0xbc, 0x02, 0x00, 0x00,
}
