// 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"`
	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
}

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"`
	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 ""
}

// 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{
	// 411 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0x4f, 0x6f, 0xd3, 0x30,
	0x1c, 0xc5, 0xed, 0x56, 0x2d, 0xbf, 0x8c, 0x51, 0x0c, 0x08, 0x8b, 0x3f, 0x52, 0xe9, 0x29, 0xda,
	0x21, 0xa0, 0xc2, 0x01, 0x38, 0x4c, 0x0a, 0x50, 0x71, 0x18, 0xea, 0x90, 0x93, 0xaa, 0xc7, 0xc8,
	0x69, 0xdd, 0x2a, 0x8a, 0x17, 0x47, 0xb6, 0xc3, 0x94, 0x4f, 0xc9, 0x57, 0xe0, 0xa3, 0x20, 0xbb,
	0x0e, 0x1b, 0xd5, 0x4e, 0x79, 0x7e, 0xef, 0xe7, 0xe7, 0xf7, 0x7b, 0x0a, 0x84, 0x8a, 0x8b, 0xb6,
	0x8c, 0x1b, 0x25, 0x8d, 0xc4, 0x23, 0xf7, 0xd1, 0xd3, 0xdf, 0x08, 0x4e, 0x56, 0x52, 0x55, 0x5b,
	0x21, 0x6f, 0x30, 0x86, 0xa3, 0x9a, 0x5d, 0x73, 0x82, 0x26, 0x28, 0x0a, 0xa8, 0xc3, 0xf8, 0x02,
	0x1e, 0x15, 0x6d, 0x29, 0x36, 0xac, 0x10, 0x3c, 0x37, 0x4c, 0x57, 0x9a, 0x0c, 0x26, 0xc3, 0x28,
	0x9c, 0x3d, 0xdb, 0x3b, 0xe9, 0xf8, 0x4b, 0x2f, 0x67, 0x4c, 0x57, 0xf4, 0xac, 0xb8, 0x7b, 0xd4,
	0xf8, 0x03, 0x8c, 0x1a, 0xa6, 0xd8, 0xb5, 0x26, 0x43, 0x77, 0xed, 0x55, 0x7f, 0xad, 0x7f, 0x35,
	0xfe, 0xe9, 0xe4, 0x79, 0x6d, 0x54, 0x47, 0xfd, 0xec, 0x8b, 0x4f, 0x10, 0xde, 0xa1, 0xf1, 0x18,
	0x86, 0x15, 0xef, 0x7c, 0x2e, 0x0b, 0xf1, 0x53, 0x38, 0xfe, 0xc5, 0x44, 0xcb, 0xc9, 0xc0, 0x71,
	0xfb, 0xc3, 0xe7, 0xc1, 0x47, 0x34, 0xfd, 0x83, 0xe0, 0xe1, 0x7f, 0x91, 0xee, 0x5d, 0xeb, 0x35,
	0xc0, 0x86, 0x37, 0xbc, 0xde, 0xe8, 0x5c, 0xd6, 0xde, 0x24, 0xf0, 0xcc, 0x55, 0x8d, 0xcf, 0x61,
	0xa4, 0x0d, 0x33, 0xad, 0x4d, 0x8d, 0xa2, 0xb3, 0x19, 0xee, 0x53, 0x5b, 0xc3, 0xd4, 0x29, 0xd4,
	0x4f, 0xe0, 0x37, 0x70, 0xca, 0x94, 0x29, 0xb7, 0x6c, 0x6d, 0xf2, 0x56, 0x09, 0x72, 0xe4, 0xcc,
	0xc2, 0x9e, 0x5b, 0x2a, 0x81, 0xdf, 0x01, 0xec, 0x4a, 0x93, 0x6b, 0xd9, 0xaa, 0x35, 0x27, 0xc7,
	0x13, 0x14, 0x85, 0xb3, 0xc7, 0xbd, 0xe5, 0xf7, 0xd2, 0xa4, 0x4e, 0xa0, 0xc1, 0xae, 0x87, 0xf8,
	0x25, 0x04, 0xb6, 0xec, 0xdc, 0x74, 0x0d, 0x27, 0x23, 0xe7, 0x78, 0x62, 0x89, 0xac, 0x6b, 0xf8,
	0xf4, 0x02, 0x4e, 0x7f, 0xc8, 0x35, 0x13, 0xa9, 0x91, 0x8a, 0xed, 0x38, 0x8e, 0x21, 0xb8, 0xf1,
	0x6d, 0x6a, 0x82, 0x5c, 0xcd, 0xe3, 0xc3, 0x9a, 0xe9, 0xed, 0xc8, 0xf4, 0x2d, 0x04, 0xff, 0x1e,
	0xb5, 0xdd, 0xda, 0xd4, 0xbe, 0xdb, 0x56, 0x09, 0xcb, 0x28, 0xbe, 0xf5, 0xa5, 0x58, 0x78, 0xbe,
	0x02, 0xb8, 0x5d, 0x1c, 0x3f, 0x87, 0x27, 0x59, 0x92, 0x5e, 0xe6, 0x69, 0x96, 0x64, 0xcb, 0x34,
	0x5f, 0x2e, 0x2e, 0x17, 0x57, 0xab, 0xc5, 0xf8, 0xc1, 0xa1, 0xf0, 0x95, 0xce, 0x93, 0x6c, 0xfe,
	0x6d, 0x8c, 0x0e, 0x85, 0x34, 0x4b, 0xa8, 0x15, 0x06, 0xc5, 0xfe, 0x37, 0x7c, 0xff, 0x37, 0x00,
	0x00, 0xff, 0xff, 0xfa, 0x0a, 0x66, 0x8f, 0x9c, 0x02, 0x00, 0x00,
}
