// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test_platform/common/task.proto

package common

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

// TaskLogData describes the location at which logs of a test_platform task
// are stored.
type TaskLogData struct {
	// gs_url is the full google storage URL at which a task's logs are stored.
	GsUrl string `protobuf:"bytes,1,opt,name=gs_url,json=gsUrl,proto3" json:"gs_url,omitempty"`
	// stainless_url is the full URL to the stainless logs viewer for archived
	// logs.
	StainlessUrl         string   `protobuf:"bytes,2,opt,name=stainless_url,json=stainlessUrl,proto3" json:"stainless_url,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_TaskLogData proto.InternalMessageInfo

func (m *TaskLogData) GetGsUrl() string {
	if m != nil {
		return m.GsUrl
	}
	return ""
}

func (m *TaskLogData) GetStainlessUrl() string {
	if m != nil {
		return m.StainlessUrl
	}
	return ""
}

func init() {
	proto.RegisterType((*TaskLogData)(nil), "test_platform.common.TaskLogData")
}

func init() { proto.RegisterFile("test_platform/common/task.proto", fileDescriptor_652d62a2aed46100) }

var fileDescriptor_652d62a2aed46100 = []byte{
	// 169 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x2f, 0x49, 0x2d, 0x2e,
	0x89, 0x2f, 0xc8, 0x49, 0x2c, 0x49, 0xcb, 0x2f, 0xca, 0xd5, 0x4f, 0xce, 0xcf, 0xcd, 0xcd, 0xcf,
	0xd3, 0x2f, 0x49, 0x2c, 0xce, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x41, 0x51, 0xa0,
	0x07, 0x51, 0xa0, 0xe4, 0xc9, 0xc5, 0x1d, 0x92, 0x58, 0x9c, 0xed, 0x93, 0x9f, 0xee, 0x92, 0x58,
	0x92, 0x28, 0x24, 0xca, 0xc5, 0x96, 0x5e, 0x1c, 0x5f, 0x5a, 0x94, 0x23, 0xc1, 0xa8, 0xc0, 0xa8,
	0xc1, 0x19, 0xc4, 0x9a, 0x5e, 0x1c, 0x5a, 0x94, 0x23, 0xa4, 0xcc, 0xc5, 0x5b, 0x5c, 0x92, 0x98,
	0x99, 0x97, 0x93, 0x5a, 0x0c, 0x91, 0x65, 0x02, 0xcb, 0xf2, 0xc0, 0x05, 0x43, 0x8b, 0x72, 0x9c,
	0x1c, 0xa2, 0xec, 0xd2, 0xf3, 0xf5, 0x92, 0x33, 0x8a, 0xf2, 0x73, 0x33, 0x4b, 0x73, 0xf5, 0xf2,
	0x8b, 0xd2, 0xf5, 0x61, 0x9c, 0xfc, 0x62, 0xfd, 0xcc, 0xbc, 0xb4, 0xa2, 0x44, 0x7d, 0xb0, 0x53,
	0xf4, 0xd3, 0xf3, 0xf5, 0xb1, 0xb9, 0x36, 0x89, 0x0d, 0x2c, 0x6d, 0x0c, 0x08, 0x00, 0x00, 0xff,
	0xff, 0x09, 0x3b, 0x6d, 0x27, 0xcc, 0x00, 0x00, 0x00,
}
