// Code generated by protoc-gen-go.
// source: google/devtools/build/v1/build_events.proto
// DO NOT EDIT!

/*
Package build is a generated protocol buffer package.

It is generated from these files:
	google/devtools/build/v1/build_events.proto
	google/devtools/build/v1/build_status.proto
	google/devtools/build/v1/publish_build_event.proto

It has these top-level messages:
	BuildEvent
	StreamId
	BuildStatus
	PublishLifecycleEventRequest
	PublishBuildToolEventStreamResponse
	OrderedBuildEvent
*/
package build

import proto "github.com/golang/protobuf/proto"
import fmt "fmt"
import math "math"
import _ "google.golang.org/genproto/googleapis/api/annotations"
import google_protobuf1 "github.com/golang/protobuf/ptypes/any"
import google_protobuf2 "github.com/golang/protobuf/ptypes/timestamp"
import google_protobuf3 "github.com/golang/protobuf/ptypes/wrappers"
import google_rpc "google.golang.org/genproto/googleapis/rpc/status"

// 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.ProtoPackageIsVersion2 // please upgrade the proto package

// The type of console output stream.
type ConsoleOutputStream int32

const (
	// Unspecified or unknown.
	ConsoleOutputStream_UNKNOWN ConsoleOutputStream = 0
	// Normal output stream.
	ConsoleOutputStream_STDOUT ConsoleOutputStream = 1
	// Error output stream.
	ConsoleOutputStream_STDERR ConsoleOutputStream = 2
)

var ConsoleOutputStream_name = map[int32]string{
	0: "UNKNOWN",
	1: "STDOUT",
	2: "STDERR",
}
var ConsoleOutputStream_value = map[string]int32{
	"UNKNOWN": 0,
	"STDOUT":  1,
	"STDERR":  2,
}

func (x ConsoleOutputStream) String() string {
	return proto.EnumName(ConsoleOutputStream_name, int32(x))
}
func (ConsoleOutputStream) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }

// How did the event stream finish.
type BuildEvent_BuildComponentStreamFinished_FinishType int32

const (
	// Unknown or unspecified; callers should never set this value.
	BuildEvent_BuildComponentStreamFinished_FINISH_TYPE_UNSPECIFIED BuildEvent_BuildComponentStreamFinished_FinishType = 0
	// Set by the event publisher to indicate a build event stream is
	// finished.
	BuildEvent_BuildComponentStreamFinished_FINISHED BuildEvent_BuildComponentStreamFinished_FinishType = 1
	// Set by the WatchBuild RPC server when the publisher of a build event
	// stream stops publishing events without publishing a
	// BuildComponentStreamFinished event whose type equals FINISHED.
	BuildEvent_BuildComponentStreamFinished_EXPIRED BuildEvent_BuildComponentStreamFinished_FinishType = 2
)

var BuildEvent_BuildComponentStreamFinished_FinishType_name = map[int32]string{
	0: "FINISH_TYPE_UNSPECIFIED",
	1: "FINISHED",
	2: "EXPIRED",
}
var BuildEvent_BuildComponentStreamFinished_FinishType_value = map[string]int32{
	"FINISH_TYPE_UNSPECIFIED": 0,
	"FINISHED":                1,
	"EXPIRED":                 2,
}

func (x BuildEvent_BuildComponentStreamFinished_FinishType) String() string {
	return proto.EnumName(BuildEvent_BuildComponentStreamFinished_FinishType_name, int32(x))
}
func (BuildEvent_BuildComponentStreamFinished_FinishType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor0, []int{0, 5, 0}
}

// Which build component generates this event stream. Each build component
// may generate one event stream.
type StreamId_BuildComponent int32

const (
	// Unknown or unspecified; callers should never set this value.
	StreamId_UNKNOWN_COMPONENT StreamId_BuildComponent = 0
	// A component that coordinates builds.
	StreamId_CONTROLLER StreamId_BuildComponent = 1
	// A component that runs executables needed to complete a build.
	StreamId_WORKER StreamId_BuildComponent = 2
	// A component that builds something.
	StreamId_TOOL       StreamId_BuildComponent = 3
	StreamId_DEPRECATED StreamId_BuildComponent = 4
)

var StreamId_BuildComponent_name = map[int32]string{
	0: "UNKNOWN_COMPONENT",
	1: "CONTROLLER",
	2: "WORKER",
	3: "TOOL",
	4: "DEPRECATED",
}
var StreamId_BuildComponent_value = map[string]int32{
	"UNKNOWN_COMPONENT": 0,
	"CONTROLLER":        1,
	"WORKER":            2,
	"TOOL":              3,
	"DEPRECATED":        4,
}

func (x StreamId_BuildComponent) String() string {
	return proto.EnumName(StreamId_BuildComponent_name, int32(x))
}
func (StreamId_BuildComponent) EnumDescriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} }

// An event representing some state change that occured in the build. This
// message does not include field for uniquely identifying an event.
type BuildEvent struct {
	// The timestamp of this event.
	EventTime *google_protobuf2.Timestamp `protobuf:"bytes,1,opt,name=event_time,json=eventTime" json:"event_time,omitempty"`
	// //////////////////////////////////////////////////////////////////////////
	// Events that indicate a state change of a build request in the build
	// queue.
	//
	// Types that are valid to be assigned to Event:
	//	*BuildEvent_InvocationAttemptStarted_
	//	*BuildEvent_InvocationAttemptFinished_
	//	*BuildEvent_BuildEnqueued_
	//	*BuildEvent_BuildFinished_
	//	*BuildEvent_ConsoleOutput_
	//	*BuildEvent_ComponentStreamFinished
	//	*BuildEvent_BazelEvent
	//	*BuildEvent_BuildExecutionEvent
	//	*BuildEvent_SourceFetchEvent
	Event isBuildEvent_Event `protobuf_oneof:"event"`
}

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

type isBuildEvent_Event interface {
	isBuildEvent_Event()
}

type BuildEvent_InvocationAttemptStarted_ struct {
	InvocationAttemptStarted *BuildEvent_InvocationAttemptStarted `protobuf:"bytes,51,opt,name=invocation_attempt_started,json=invocationAttemptStarted,oneof"`
}
type BuildEvent_InvocationAttemptFinished_ struct {
	InvocationAttemptFinished *BuildEvent_InvocationAttemptFinished `protobuf:"bytes,52,opt,name=invocation_attempt_finished,json=invocationAttemptFinished,oneof"`
}
type BuildEvent_BuildEnqueued_ struct {
	BuildEnqueued *BuildEvent_BuildEnqueued `protobuf:"bytes,53,opt,name=build_enqueued,json=buildEnqueued,oneof"`
}
type BuildEvent_BuildFinished_ struct {
	BuildFinished *BuildEvent_BuildFinished `protobuf:"bytes,55,opt,name=build_finished,json=buildFinished,oneof"`
}
type BuildEvent_ConsoleOutput_ struct {
	ConsoleOutput *BuildEvent_ConsoleOutput `protobuf:"bytes,56,opt,name=console_output,json=consoleOutput,oneof"`
}
type BuildEvent_ComponentStreamFinished struct {
	ComponentStreamFinished *BuildEvent_BuildComponentStreamFinished `protobuf:"bytes,59,opt,name=component_stream_finished,json=componentStreamFinished,oneof"`
}
type BuildEvent_BazelEvent struct {
	BazelEvent *google_protobuf1.Any `protobuf:"bytes,60,opt,name=bazel_event,json=bazelEvent,oneof"`
}
type BuildEvent_BuildExecutionEvent struct {
	BuildExecutionEvent *google_protobuf1.Any `protobuf:"bytes,61,opt,name=build_execution_event,json=buildExecutionEvent,oneof"`
}
type BuildEvent_SourceFetchEvent struct {
	SourceFetchEvent *google_protobuf1.Any `protobuf:"bytes,62,opt,name=source_fetch_event,json=sourceFetchEvent,oneof"`
}

func (*BuildEvent_InvocationAttemptStarted_) isBuildEvent_Event()  {}
func (*BuildEvent_InvocationAttemptFinished_) isBuildEvent_Event() {}
func (*BuildEvent_BuildEnqueued_) isBuildEvent_Event()             {}
func (*BuildEvent_BuildFinished_) isBuildEvent_Event()             {}
func (*BuildEvent_ConsoleOutput_) isBuildEvent_Event()             {}
func (*BuildEvent_ComponentStreamFinished) isBuildEvent_Event()    {}
func (*BuildEvent_BazelEvent) isBuildEvent_Event()                 {}
func (*BuildEvent_BuildExecutionEvent) isBuildEvent_Event()        {}
func (*BuildEvent_SourceFetchEvent) isBuildEvent_Event()           {}

func (m *BuildEvent) GetEvent() isBuildEvent_Event {
	if m != nil {
		return m.Event
	}
	return nil
}

func (m *BuildEvent) GetEventTime() *google_protobuf2.Timestamp {
	if m != nil {
		return m.EventTime
	}
	return nil
}

func (m *BuildEvent) GetInvocationAttemptStarted() *BuildEvent_InvocationAttemptStarted {
	if x, ok := m.GetEvent().(*BuildEvent_InvocationAttemptStarted_); ok {
		return x.InvocationAttemptStarted
	}
	return nil
}

func (m *BuildEvent) GetInvocationAttemptFinished() *BuildEvent_InvocationAttemptFinished {
	if x, ok := m.GetEvent().(*BuildEvent_InvocationAttemptFinished_); ok {
		return x.InvocationAttemptFinished
	}
	return nil
}

func (m *BuildEvent) GetBuildEnqueued() *BuildEvent_BuildEnqueued {
	if x, ok := m.GetEvent().(*BuildEvent_BuildEnqueued_); ok {
		return x.BuildEnqueued
	}
	return nil
}

func (m *BuildEvent) GetBuildFinished() *BuildEvent_BuildFinished {
	if x, ok := m.GetEvent().(*BuildEvent_BuildFinished_); ok {
		return x.BuildFinished
	}
	return nil
}

func (m *BuildEvent) GetConsoleOutput() *BuildEvent_ConsoleOutput {
	if x, ok := m.GetEvent().(*BuildEvent_ConsoleOutput_); ok {
		return x.ConsoleOutput
	}
	return nil
}

func (m *BuildEvent) GetComponentStreamFinished() *BuildEvent_BuildComponentStreamFinished {
	if x, ok := m.GetEvent().(*BuildEvent_ComponentStreamFinished); ok {
		return x.ComponentStreamFinished
	}
	return nil
}

func (m *BuildEvent) GetBazelEvent() *google_protobuf1.Any {
	if x, ok := m.GetEvent().(*BuildEvent_BazelEvent); ok {
		return x.BazelEvent
	}
	return nil
}

func (m *BuildEvent) GetBuildExecutionEvent() *google_protobuf1.Any {
	if x, ok := m.GetEvent().(*BuildEvent_BuildExecutionEvent); ok {
		return x.BuildExecutionEvent
	}
	return nil
}

func (m *BuildEvent) GetSourceFetchEvent() *google_protobuf1.Any {
	if x, ok := m.GetEvent().(*BuildEvent_SourceFetchEvent); ok {
		return x.SourceFetchEvent
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*BuildEvent) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _BuildEvent_OneofMarshaler, _BuildEvent_OneofUnmarshaler, _BuildEvent_OneofSizer, []interface{}{
		(*BuildEvent_InvocationAttemptStarted_)(nil),
		(*BuildEvent_InvocationAttemptFinished_)(nil),
		(*BuildEvent_BuildEnqueued_)(nil),
		(*BuildEvent_BuildFinished_)(nil),
		(*BuildEvent_ConsoleOutput_)(nil),
		(*BuildEvent_ComponentStreamFinished)(nil),
		(*BuildEvent_BazelEvent)(nil),
		(*BuildEvent_BuildExecutionEvent)(nil),
		(*BuildEvent_SourceFetchEvent)(nil),
	}
}

func _BuildEvent_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*BuildEvent)
	// event
	switch x := m.Event.(type) {
	case *BuildEvent_InvocationAttemptStarted_:
		b.EncodeVarint(51<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.InvocationAttemptStarted); err != nil {
			return err
		}
	case *BuildEvent_InvocationAttemptFinished_:
		b.EncodeVarint(52<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.InvocationAttemptFinished); err != nil {
			return err
		}
	case *BuildEvent_BuildEnqueued_:
		b.EncodeVarint(53<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.BuildEnqueued); err != nil {
			return err
		}
	case *BuildEvent_BuildFinished_:
		b.EncodeVarint(55<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.BuildFinished); err != nil {
			return err
		}
	case *BuildEvent_ConsoleOutput_:
		b.EncodeVarint(56<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ConsoleOutput); err != nil {
			return err
		}
	case *BuildEvent_ComponentStreamFinished:
		b.EncodeVarint(59<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.ComponentStreamFinished); err != nil {
			return err
		}
	case *BuildEvent_BazelEvent:
		b.EncodeVarint(60<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.BazelEvent); err != nil {
			return err
		}
	case *BuildEvent_BuildExecutionEvent:
		b.EncodeVarint(61<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.BuildExecutionEvent); err != nil {
			return err
		}
	case *BuildEvent_SourceFetchEvent:
		b.EncodeVarint(62<<3 | proto.WireBytes)
		if err := b.EncodeMessage(x.SourceFetchEvent); err != nil {
			return err
		}
	case nil:
	default:
		return fmt.Errorf("BuildEvent.Event has unexpected type %T", x)
	}
	return nil
}

func _BuildEvent_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*BuildEvent)
	switch tag {
	case 51: // event.invocation_attempt_started
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BuildEvent_InvocationAttemptStarted)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_InvocationAttemptStarted_{msg}
		return true, err
	case 52: // event.invocation_attempt_finished
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BuildEvent_InvocationAttemptFinished)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_InvocationAttemptFinished_{msg}
		return true, err
	case 53: // event.build_enqueued
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BuildEvent_BuildEnqueued)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_BuildEnqueued_{msg}
		return true, err
	case 55: // event.build_finished
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BuildEvent_BuildFinished)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_BuildFinished_{msg}
		return true, err
	case 56: // event.console_output
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BuildEvent_ConsoleOutput)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_ConsoleOutput_{msg}
		return true, err
	case 59: // event.component_stream_finished
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(BuildEvent_BuildComponentStreamFinished)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_ComponentStreamFinished{msg}
		return true, err
	case 60: // event.bazel_event
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(google_protobuf1.Any)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_BazelEvent{msg}
		return true, err
	case 61: // event.build_execution_event
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(google_protobuf1.Any)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_BuildExecutionEvent{msg}
		return true, err
	case 62: // event.source_fetch_event
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		msg := new(google_protobuf1.Any)
		err := b.DecodeMessage(msg)
		m.Event = &BuildEvent_SourceFetchEvent{msg}
		return true, err
	default:
		return false, nil
	}
}

func _BuildEvent_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*BuildEvent)
	// event
	switch x := m.Event.(type) {
	case *BuildEvent_InvocationAttemptStarted_:
		s := proto.Size(x.InvocationAttemptStarted)
		n += proto.SizeVarint(51<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_InvocationAttemptFinished_:
		s := proto.Size(x.InvocationAttemptFinished)
		n += proto.SizeVarint(52<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_BuildEnqueued_:
		s := proto.Size(x.BuildEnqueued)
		n += proto.SizeVarint(53<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_BuildFinished_:
		s := proto.Size(x.BuildFinished)
		n += proto.SizeVarint(55<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_ConsoleOutput_:
		s := proto.Size(x.ConsoleOutput)
		n += proto.SizeVarint(56<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_ComponentStreamFinished:
		s := proto.Size(x.ComponentStreamFinished)
		n += proto.SizeVarint(59<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_BazelEvent:
		s := proto.Size(x.BazelEvent)
		n += proto.SizeVarint(60<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_BuildExecutionEvent:
		s := proto.Size(x.BuildExecutionEvent)
		n += proto.SizeVarint(61<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case *BuildEvent_SourceFetchEvent:
		s := proto.Size(x.SourceFetchEvent)
		n += proto.SizeVarint(62<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(s))
		n += s
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Notification that the build system has attempted to run the build tool.
type BuildEvent_InvocationAttemptStarted struct {
	// The number of the invocation attempt, starting at 1 and increasing by 1
	// for each new attempt. Can be used to determine if there is a later
	// invocation attempt replacing the current one a client is processing.
	AttemptNumber int64 `protobuf:"varint,1,opt,name=attempt_number,json=attemptNumber" json:"attempt_number,omitempty"`
}

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

func (m *BuildEvent_InvocationAttemptStarted) GetAttemptNumber() int64 {
	if m != nil {
		return m.AttemptNumber
	}
	return 0
}

// Notification that an invocation attempt has finished.
type BuildEvent_InvocationAttemptFinished struct {
	// The status of the build request.
	// If OK, the build request was run, though this does not mean the
	// requested build tool succeeded. "exit_code" will be set to the
	// exit code of the build tool.
	// If not OK, the build request was not successfully executed.
	// "exit_code" will not be set.
	Status *google_rpc.Status `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
	// The exit code of the build tool.
	ExitCode *google_protobuf3.Int32Value `protobuf:"bytes,2,opt,name=exit_code,json=exitCode" json:"exit_code,omitempty"`
	// Final status of the invocation.
	InvocationStatus *BuildStatus `protobuf:"bytes,3,opt,name=invocation_status,json=invocationStatus" json:"invocation_status,omitempty"`
}

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

func (m *BuildEvent_InvocationAttemptFinished) GetStatus() *google_rpc.Status {
	if m != nil {
		return m.Status
	}
	return nil
}

func (m *BuildEvent_InvocationAttemptFinished) GetExitCode() *google_protobuf3.Int32Value {
	if m != nil {
		return m.ExitCode
	}
	return nil
}

func (m *BuildEvent_InvocationAttemptFinished) GetInvocationStatus() *BuildStatus {
	if m != nil {
		return m.InvocationStatus
	}
	return nil
}

// Notification that the build request is enqueued. It could happen when
// a new build request is inserted into the build queue, or when a
// build request is put back into the build queue due to a previous build
// failure.
type BuildEvent_BuildEnqueued struct {
}

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

// Notification that the build request has finished, and no further
// invocations will occur.  Note that this applies to the entire Build.
// Individual invocations trigger InvocationFinished when they finish.
type BuildEvent_BuildFinished struct {
	// Final status of the build.
	Status *BuildStatus `protobuf:"bytes,1,opt,name=status" json:"status,omitempty"`
}

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

func (m *BuildEvent_BuildFinished) GetStatus() *BuildStatus {
	if m != nil {
		return m.Status
	}
	return nil
}

// Textual output written to standard output or standard error.
type BuildEvent_ConsoleOutput struct {
	// The output stream type.
	Type ConsoleOutputStream `protobuf:"varint,1,opt,name=type,enum=google.devtools.build.v1.ConsoleOutputStream" json:"type,omitempty"`
	// The output stream content.
	//
	// Types that are valid to be assigned to Output:
	//	*BuildEvent_ConsoleOutput_TextOutput
	//	*BuildEvent_ConsoleOutput_BinaryOutput
	Output isBuildEvent_ConsoleOutput_Output `protobuf_oneof:"output"`
}

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

type isBuildEvent_ConsoleOutput_Output interface {
	isBuildEvent_ConsoleOutput_Output()
}

type BuildEvent_ConsoleOutput_TextOutput struct {
	TextOutput string `protobuf:"bytes,2,opt,name=text_output,json=textOutput,oneof"`
}
type BuildEvent_ConsoleOutput_BinaryOutput struct {
	BinaryOutput []byte `protobuf:"bytes,3,opt,name=binary_output,json=binaryOutput,proto3,oneof"`
}

func (*BuildEvent_ConsoleOutput_TextOutput) isBuildEvent_ConsoleOutput_Output()   {}
func (*BuildEvent_ConsoleOutput_BinaryOutput) isBuildEvent_ConsoleOutput_Output() {}

func (m *BuildEvent_ConsoleOutput) GetOutput() isBuildEvent_ConsoleOutput_Output {
	if m != nil {
		return m.Output
	}
	return nil
}

func (m *BuildEvent_ConsoleOutput) GetType() ConsoleOutputStream {
	if m != nil {
		return m.Type
	}
	return ConsoleOutputStream_UNKNOWN
}

func (m *BuildEvent_ConsoleOutput) GetTextOutput() string {
	if x, ok := m.GetOutput().(*BuildEvent_ConsoleOutput_TextOutput); ok {
		return x.TextOutput
	}
	return ""
}

func (m *BuildEvent_ConsoleOutput) GetBinaryOutput() []byte {
	if x, ok := m.GetOutput().(*BuildEvent_ConsoleOutput_BinaryOutput); ok {
		return x.BinaryOutput
	}
	return nil
}

// XXX_OneofFuncs is for the internal use of the proto package.
func (*BuildEvent_ConsoleOutput) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) {
	return _BuildEvent_ConsoleOutput_OneofMarshaler, _BuildEvent_ConsoleOutput_OneofUnmarshaler, _BuildEvent_ConsoleOutput_OneofSizer, []interface{}{
		(*BuildEvent_ConsoleOutput_TextOutput)(nil),
		(*BuildEvent_ConsoleOutput_BinaryOutput)(nil),
	}
}

func _BuildEvent_ConsoleOutput_OneofMarshaler(msg proto.Message, b *proto.Buffer) error {
	m := msg.(*BuildEvent_ConsoleOutput)
	// output
	switch x := m.Output.(type) {
	case *BuildEvent_ConsoleOutput_TextOutput:
		b.EncodeVarint(2<<3 | proto.WireBytes)
		b.EncodeStringBytes(x.TextOutput)
	case *BuildEvent_ConsoleOutput_BinaryOutput:
		b.EncodeVarint(3<<3 | proto.WireBytes)
		b.EncodeRawBytes(x.BinaryOutput)
	case nil:
	default:
		return fmt.Errorf("BuildEvent_ConsoleOutput.Output has unexpected type %T", x)
	}
	return nil
}

func _BuildEvent_ConsoleOutput_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) {
	m := msg.(*BuildEvent_ConsoleOutput)
	switch tag {
	case 2: // output.text_output
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeStringBytes()
		m.Output = &BuildEvent_ConsoleOutput_TextOutput{x}
		return true, err
	case 3: // output.binary_output
		if wire != proto.WireBytes {
			return true, proto.ErrInternalBadWireType
		}
		x, err := b.DecodeRawBytes(true)
		m.Output = &BuildEvent_ConsoleOutput_BinaryOutput{x}
		return true, err
	default:
		return false, nil
	}
}

func _BuildEvent_ConsoleOutput_OneofSizer(msg proto.Message) (n int) {
	m := msg.(*BuildEvent_ConsoleOutput)
	// output
	switch x := m.Output.(type) {
	case *BuildEvent_ConsoleOutput_TextOutput:
		n += proto.SizeVarint(2<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(len(x.TextOutput)))
		n += len(x.TextOutput)
	case *BuildEvent_ConsoleOutput_BinaryOutput:
		n += proto.SizeVarint(3<<3 | proto.WireBytes)
		n += proto.SizeVarint(uint64(len(x.BinaryOutput)))
		n += len(x.BinaryOutput)
	case nil:
	default:
		panic(fmt.Sprintf("proto: unexpected type %T in oneof", x))
	}
	return n
}

// Notification of the end of a build event stream published by a build
// component other than CONTROLLER (See StreamId.BuildComponents).
type BuildEvent_BuildComponentStreamFinished struct {
	// How the event stream finished.
	Type BuildEvent_BuildComponentStreamFinished_FinishType `protobuf:"varint,1,opt,name=type,enum=google.devtools.build.v1.BuildEvent_BuildComponentStreamFinished_FinishType" json:"type,omitempty"`
}

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

func (m *BuildEvent_BuildComponentStreamFinished) GetType() BuildEvent_BuildComponentStreamFinished_FinishType {
	if m != nil {
		return m.Type
	}
	return BuildEvent_BuildComponentStreamFinished_FINISH_TYPE_UNSPECIFIED
}

// Unique identifier for a build event stream.
type StreamId struct {
	ProjectNumber int64 `protobuf:"varint,5,opt,name=project_number,json=projectNumber" json:"project_number,omitempty"`
	// The id of a Build message.
	BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId" json:"build_id,omitempty"`
	// The unique invocation ID within this build.
	// It should be the same as {invocation} (below) during the migration.
	InvocationId string `protobuf:"bytes,6,opt,name=invocation_id,json=invocationId" json:"invocation_id,omitempty"`
	// The component that emitted this event.
	Component StreamId_BuildComponent `protobuf:"varint,3,opt,name=component,enum=google.devtools.build.v1.StreamId_BuildComponent" json:"component,omitempty"`
	// The unique invocation ID within this build.
	// It should be the same as {invocation_id} below during the migration.
	Invocation string `protobuf:"bytes,4,opt,name=invocation" json:"invocation,omitempty"`
}

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

func (m *StreamId) GetProjectNumber() int64 {
	if m != nil {
		return m.ProjectNumber
	}
	return 0
}

func (m *StreamId) GetBuildId() string {
	if m != nil {
		return m.BuildId
	}
	return ""
}

func (m *StreamId) GetInvocationId() string {
	if m != nil {
		return m.InvocationId
	}
	return ""
}

func (m *StreamId) GetComponent() StreamId_BuildComponent {
	if m != nil {
		return m.Component
	}
	return StreamId_UNKNOWN_COMPONENT
}

func (m *StreamId) GetInvocation() string {
	if m != nil {
		return m.Invocation
	}
	return ""
}

func init() {
	proto.RegisterType((*BuildEvent)(nil), "google.devtools.build.v1.BuildEvent")
	proto.RegisterType((*BuildEvent_InvocationAttemptStarted)(nil), "google.devtools.build.v1.BuildEvent.InvocationAttemptStarted")
	proto.RegisterType((*BuildEvent_InvocationAttemptFinished)(nil), "google.devtools.build.v1.BuildEvent.InvocationAttemptFinished")
	proto.RegisterType((*BuildEvent_BuildEnqueued)(nil), "google.devtools.build.v1.BuildEvent.BuildEnqueued")
	proto.RegisterType((*BuildEvent_BuildFinished)(nil), "google.devtools.build.v1.BuildEvent.BuildFinished")
	proto.RegisterType((*BuildEvent_ConsoleOutput)(nil), "google.devtools.build.v1.BuildEvent.ConsoleOutput")
	proto.RegisterType((*BuildEvent_BuildComponentStreamFinished)(nil), "google.devtools.build.v1.BuildEvent.BuildComponentStreamFinished")
	proto.RegisterType((*StreamId)(nil), "google.devtools.build.v1.StreamId")
	proto.RegisterEnum("google.devtools.build.v1.ConsoleOutputStream", ConsoleOutputStream_name, ConsoleOutputStream_value)
	proto.RegisterEnum("google.devtools.build.v1.BuildEvent_BuildComponentStreamFinished_FinishType", BuildEvent_BuildComponentStreamFinished_FinishType_name, BuildEvent_BuildComponentStreamFinished_FinishType_value)
	proto.RegisterEnum("google.devtools.build.v1.StreamId_BuildComponent", StreamId_BuildComponent_name, StreamId_BuildComponent_value)
}

func init() { proto.RegisterFile("google/devtools/build/v1/build_events.proto", fileDescriptor0) }

var fileDescriptor0 = []byte{
	// 979 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x56, 0x6d, 0x6f, 0xdb, 0x54,
	0x14, 0x8e, 0xbb, 0xae, 0x4d, 0x4f, 0x9b, 0xcc, 0xbb, 0x63, 0xaa, 0xeb, 0x56, 0x03, 0x8a, 0x2a,
	0xa1, 0x21, 0x1c, 0xb5, 0x05, 0x6d, 0x30, 0x3a, 0x29, 0x4d, 0x5c, 0xc5, 0xac, 0xd8, 0xd1, 0x8d,
	0xcb, 0x78, 0x11, 0x0a, 0x8e, 0x7d, 0x9b, 0x19, 0x25, 0xbe, 0xc6, 0xbe, 0x0e, 0x0d, 0x12, 0x82,
	0xff, 0x82, 0xc4, 0xff, 0xe0, 0x0b, 0xff, 0x80, 0xff, 0xc2, 0x47, 0xe4, 0x7b, 0xaf, 0xf3, 0xd2,
	0x36, 0x5d, 0x07, 0xdf, 0xec, 0x73, 0x9e, 0xf3, 0x3c, 0xe7, 0x9c, 0x3c, 0xc7, 0x0a, 0x7c, 0xd0,
	0xa7, 0xb4, 0x3f, 0x20, 0xb5, 0x80, 0x8c, 0x18, 0xa5, 0x83, 0xb4, 0xd6, 0xcb, 0xc2, 0x41, 0x50,
	0x1b, 0xed, 0x8b, 0x87, 0x2e, 0x19, 0x91, 0x88, 0xa5, 0x46, 0x9c, 0x50, 0x46, 0x91, 0x26, 0xc0,
	0x46, 0x01, 0x36, 0x38, 0xc6, 0x18, 0xed, 0xeb, 0x3b, 0x92, 0xc6, 0x8b, 0xc3, 0x9a, 0x17, 0x45,
	0x94, 0x79, 0x2c, 0xa4, 0x91, 0xac, 0xd3, 0x5f, 0x27, 0x92, 0x32, 0x8f, 0x65, 0x05, 0x78, 0x4b,
	0x82, 0xf9, 0x5b, 0x2f, 0x3b, 0xaf, 0x79, 0xd1, 0x58, 0xa6, 0xde, 0xbe, 0x9c, 0x62, 0xe1, 0x90,
	0xa4, 0xcc, 0x1b, 0xc6, 0x12, 0xf0, 0xe8, 0x32, 0xe0, 0xa7, 0xc4, 0x8b, 0x63, 0x92, 0x14, 0xdc,
	0x9b, 0x32, 0x9f, 0xc4, 0x7e, 0x6d, 0x56, 0x74, 0xf7, 0xf7, 0x0a, 0xc0, 0x71, 0xde, 0x8b, 0x99,
	0xcf, 0x8b, 0x3e, 0x01, 0xe0, 0x83, 0x77, 0x73, 0x01, 0x4d, 0x79, 0x47, 0x79, 0x7f, 0xfd, 0x40,
	0x37, 0xe4, 0xf4, 0x05, 0xb9, 0xe1, 0x16, 0xea, 0x78, 0x8d, 0xa3, 0xf3, 0x77, 0xf4, 0x0b, 0xe8,
	0x61, 0x34, 0xa2, 0x3e, 0x5f, 0x40, 0xd7, 0x63, 0x8c, 0x0c, 0x63, 0x96, 0x4f, 0x98, 0x30, 0x12,
	0x68, 0x87, 0x9c, 0xea, 0xc8, 0x58, 0xb4, 0x48, 0x63, 0xda, 0x84, 0x61, 0x4d, 0x68, 0xea, 0x82,
	0xa5, 0x23, 0x48, 0x5a, 0x25, 0xac, 0x85, 0x0b, 0x72, 0xe8, 0x37, 0x05, 0xb6, 0xaf, 0xd1, 0x3f,
	0x0f, 0xa3, 0x30, 0x7d, 0x45, 0x02, 0xed, 0x23, 0xde, 0xc0, 0xf3, 0xff, 0xd6, 0xc0, 0x89, 0x64,
	0x69, 0x95, 0xf0, 0x56, 0xb8, 0x28, 0x89, 0xbe, 0x85, 0xaa, 0xf4, 0x4e, 0xf4, 0x63, 0x46, 0x32,
	0x12, 0x68, 0x1f, 0x73, 0xd1, 0x83, 0x5b, 0x89, 0x8a, 0x47, 0x59, 0xd9, 0x2a, 0xe1, 0x4a, 0x6f,
	0x36, 0x30, 0x25, 0x9f, 0x4c, 0xf4, 0xe4, 0x4d, 0xc9, 0x67, 0xa6, 0x10, 0xe4, 0xb3, 0x9d, 0xfb,
	0x34, 0x4a, 0xe9, 0x80, 0x74, 0x69, 0xc6, 0xe2, 0x8c, 0x69, 0x4f, 0xdf, 0x80, 0xbc, 0x21, 0x4a,
	0x1d, 0x5e, 0x99, 0x93, 0xfb, 0xb3, 0x01, 0xf4, 0x2b, 0x6c, 0xf9, 0x74, 0x18, 0xd3, 0x28, 0xf7,
	0x55, 0xca, 0x12, 0xe2, 0x0d, 0xa7, 0x43, 0x3c, 0xe3, 0x3a, 0xf5, 0xdb, 0x0f, 0xd1, 0x28, 0xa8,
	0x3a, 0x9c, 0x69, 0x66, 0xa6, 0x4d, 0xff, 0xfa, 0x14, 0x7a, 0x02, 0xeb, 0x3d, 0xef, 0x67, 0x32,
	0x10, 0x37, 0xad, 0x7d, 0xc6, 0x25, 0xdf, 0xba, 0xe2, 0xea, 0x7a, 0x34, 0x6e, 0x95, 0x30, 0x70,
	0xa8, 0xb8, 0x86, 0xcf, 0xe1, 0xa1, 0xfc, 0x41, 0x2f, 0x88, 0x9f, 0x71, 0x5f, 0x09, 0x8a, 0xa3,
	0x1b, 0x29, 0x1e, 0x88, 0x5f, 0xae, 0xa8, 0x11, 0x5c, 0x4d, 0x40, 0x29, 0xcd, 0x12, 0x9f, 0x74,
	0xcf, 0x09, 0xf3, 0x5f, 0x49, 0xa2, 0xe7, 0x37, 0x12, 0xa9, 0xa2, 0xe2, 0x24, 0x2f, 0xe0, 0x2c,
	0x7a, 0x1d, 0xb4, 0x45, 0xd7, 0x81, 0xf6, 0xa0, 0x5a, 0xb8, 0x3e, 0xca, 0x86, 0x3d, 0x92, 0xf0,
	0xfb, 0xbd, 0x83, 0x2b, 0x32, 0x6a, 0xf3, 0xa0, 0xfe, 0xb7, 0x02, 0x5b, 0x0b, 0x0d, 0x8e, 0x1e,
	0xc3, 0x8a, 0xf8, 0x3e, 0xc8, 0xe3, 0x47, 0x45, 0x6b, 0x49, 0xec, 0x1b, 0x1d, 0x9e, 0xc1, 0x12,
	0x81, 0x9e, 0xc2, 0x1a, 0xb9, 0x08, 0x59, 0xd7, 0xa7, 0x01, 0xd1, 0x96, 0x38, 0x7c, 0xfb, 0xca,
	0x24, 0x56, 0xc4, 0x0e, 0x0f, 0xbe, 0xf4, 0x06, 0x19, 0xc1, 0xe5, 0x1c, 0xdd, 0xa0, 0x01, 0x41,
	0x18, 0xee, 0xcf, 0xdc, 0xaa, 0x14, 0xbc, 0xc3, 0x19, 0xf6, 0x5e, 0x63, 0x05, 0xd9, 0x83, 0x3a,
	0xad, 0x17, 0x11, 0xfd, 0x1e, 0x54, 0xe6, 0x4e, 0x48, 0xb7, 0x65, 0x60, 0x32, 0xdb, 0xd1, 0xa5,
	0xd9, 0x6e, 0x29, 0x25, 0x8b, 0xf4, 0x3f, 0x14, 0xa8, 0xcc, 0x59, 0x1d, 0xd5, 0x61, 0x99, 0x8d,
	0x63, 0xf1, 0x9d, 0xac, 0x1e, 0x7c, 0xb8, 0x98, 0x6e, 0xae, 0x4c, 0xb8, 0x13, 0xf3, 0x52, 0xf4,
	0x2e, 0xac, 0x33, 0x72, 0xc1, 0x8a, 0xb3, 0xcb, 0xb7, 0xb8, 0x96, 0xbb, 0x30, 0x0f, 0x4a, 0x95,
	0x3d, 0xa8, 0xf4, 0xc2, 0xc8, 0x4b, 0xc6, 0x05, 0x28, 0x5f, 0xd4, 0x46, 0xab, 0x84, 0x37, 0x44,
	0x58, 0xc0, 0x8e, 0xcb, 0xb0, 0x22, 0xf2, 0xfa, 0x5f, 0x0a, 0xec, 0xdc, 0x74, 0x2b, 0xe8, 0xfb,
	0xb9, 0xbe, 0x4f, 0xff, 0xf7, 0xf1, 0x19, 0xe2, 0xc1, 0x1d, 0xc7, 0x44, 0x8c, 0xb5, 0xdb, 0x04,
	0x98, 0xc6, 0xd0, 0x36, 0x6c, 0x9e, 0x58, 0xb6, 0xd5, 0x69, 0x75, 0xdd, 0xaf, 0xdb, 0x66, 0xf7,
	0xcc, 0xee, 0xb4, 0xcd, 0x86, 0x75, 0x62, 0x99, 0x4d, 0xb5, 0x84, 0x36, 0xa0, 0x2c, 0x92, 0x66,
	0x53, 0x55, 0xd0, 0x3a, 0xac, 0x9a, 0x5f, 0xb5, 0x2d, 0x6c, 0x36, 0xd5, 0xa5, 0xe3, 0x55, 0xb8,
	0xcb, 0xcf, 0x64, 0xf7, 0xcf, 0x25, 0x28, 0x0b, 0x49, 0x8b, 0xfb, 0x3c, 0x4e, 0xe8, 0x0f, 0xc4,
	0x9f, 0xf8, 0xfc, 0xae, 0xf0, 0xb9, 0x8c, 0x0a, 0x9f, 0xa3, 0x2d, 0x28, 0x8b, 0xe3, 0x0d, 0x03,
	0x3e, 0xe8, 0x1a, 0x5e, 0xe5, 0xef, 0x56, 0x80, 0xde, 0x83, 0xca, 0x8c, 0xfd, 0xc2, 0x40, 0x5b,
	0xe1, 0xf9, 0x8d, 0x69, 0xd0, 0x0a, 0x90, 0x03, 0x6b, 0x93, 0x0f, 0x0a, 0x5f, 0x79, 0xf5, 0x60,
	0x7f, 0xf1, 0xa6, 0x8a, 0xee, 0x2e, 0xed, 0x09, 0x4f, 0x39, 0xd0, 0x23, 0x80, 0xa9, 0x80, 0xb6,
	0xcc, 0x25, 0x67, 0x22, 0xbb, 0xdf, 0x41, 0x75, 0xbe, 0x18, 0x3d, 0x84, 0xfb, 0x67, 0xf6, 0x0b,
	0xdb, 0x79, 0x69, 0x77, 0x1b, 0xce, 0x17, 0x6d, 0xc7, 0x36, 0x6d, 0x57, 0x2d, 0xa1, 0x2a, 0x40,
	0xc3, 0xb1, 0x5d, 0xec, 0x9c, 0x9e, 0x9a, 0x58, 0x55, 0x10, 0xc0, 0xca, 0x4b, 0x07, 0xbf, 0x30,
	0xb1, 0xba, 0x84, 0xca, 0xb0, 0xec, 0x3a, 0xce, 0xa9, 0x7a, 0x27, 0x47, 0x35, 0xcd, 0x36, 0x36,
	0x1b, 0x75, 0xd7, 0x6c, 0xaa, 0xcb, 0x8f, 0x3f, 0x85, 0x07, 0xd7, 0xd8, 0x30, 0x5f, 0xb8, 0xd4,
	0x50, 0x4b, 0x39, 0x53, 0xc7, 0x6d, 0x3a, 0x67, 0xae, 0x60, 0xed, 0xb8, 0x4d, 0x13, 0x63, 0x75,
	0xe9, 0x38, 0x85, 0x1d, 0x9f, 0x0e, 0x17, 0x4e, 0x7f, 0x7c, 0x6f, 0x6a, 0x94, 0x76, 0x7e, 0xf8,
	0x6d, 0xe5, 0x9b, 0x23, 0x09, 0xee, 0xd3, 0x81, 0x17, 0xf5, 0x0d, 0x9a, 0xf4, 0x6b, 0x7d, 0x12,
	0xf1, 0xcf, 0x42, 0x4d, 0xa4, 0xbc, 0x38, 0x4c, 0xaf, 0xfe, 0x33, 0x7a, 0xc6, 0x1f, 0xfe, 0x51,
	0x94, 0xde, 0x0a, 0x07, 0x1f, 0xfe, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x78, 0xf8, 0x09, 0x8d, 0xaa,
	0x09, 0x00, 0x00,
}
