// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/skylab_tool/result.proto

package skylab_tool

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// WaitTaskResult describes the format returned by the `skylab wait-task` subcommand.
type WaitTaskResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Result       *WaitTaskResult_Task       `protobuf:"bytes,1,opt,name=result,json=task-result,proto3" json:"result,omitempty"`
	Stdout       string                     `protobuf:"bytes,2,opt,name=stdout,proto3" json:"stdout,omitempty"`
	ChildResults []*WaitTaskResult_Task     `protobuf:"bytes,3,rep,name=child_results,json=child-results,proto3" json:"child_results,omitempty"`
	LogDataUrl   *WaitTaskResult_LogDataURL `protobuf:"bytes,4,opt,name=log_data_url,json=log-data-url,proto3" json:"log_data_url,omitempty"`
}

func (x *WaitTaskResult) Reset() {
	*x = WaitTaskResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_tool_result_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *WaitTaskResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*WaitTaskResult) ProtoMessage() {}

func (x *WaitTaskResult) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_skylab_tool_result_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use WaitTaskResult.ProtoReflect.Descriptor instead.
func (*WaitTaskResult) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_tool_result_proto_rawDescGZIP(), []int{0}
}

func (x *WaitTaskResult) GetResult() *WaitTaskResult_Task {
	if x != nil {
		return x.Result
	}
	return nil
}

func (x *WaitTaskResult) GetStdout() string {
	if x != nil {
		return x.Stdout
	}
	return ""
}

func (x *WaitTaskResult) GetChildResults() []*WaitTaskResult_Task {
	if x != nil {
		return x.ChildResults
	}
	return nil
}

func (x *WaitTaskResult) GetLogDataUrl() *WaitTaskResult_LogDataURL {
	if x != nil {
		return x.LogDataUrl
	}
	return nil
}

// WaitTasksResult describes the format returned by the `skylab wait-tasks` subcommand.
type WaitTasksResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Results []*WaitTaskResult `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"`
	// True if an error or timeout was encountered while waiting for tasks to complete.
	Incomplete bool `protobuf:"varint,2,opt,name=incomplete,proto3" json:"incomplete,omitempty"`
}

func (x *WaitTasksResult) Reset() {
	*x = WaitTasksResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_tool_result_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *WaitTasksResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*WaitTasksResult) ProtoMessage() {}

func (x *WaitTasksResult) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_skylab_tool_result_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use WaitTasksResult.ProtoReflect.Descriptor instead.
func (*WaitTasksResult) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_tool_result_proto_rawDescGZIP(), []int{1}
}

func (x *WaitTasksResult) GetResults() []*WaitTaskResult {
	if x != nil {
		return x.Results
	}
	return nil
}

func (x *WaitTasksResult) GetIncomplete() bool {
	if x != nil {
		return x.Incomplete
	}
	return false
}

type WaitTaskResult_Task struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Name  string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"`
	// TODO(crbug.com/964573): Deprecate this field.
	Failure bool `protobuf:"varint,3,opt,name=failure,proto3" json:"failure,omitempty"`
	Success bool `protobuf:"varint,4,opt,name=success,proto3" json:"success,omitempty"`
	// Note: These fields are a little problematic, because they are not independently
	// meaningful to the caller; their meaning depends on the namespace (buildbucket vs. swarming)
	// and, in the case of swarming, environment (dev vs. prod).
	// Still, they are used by some clients, so preserved for now.
	// Note the distinction between TaskRunID and TaskRequestID: in buildbucket runs,
	// these will be equal. In swarming runs, they will differ in the last character
	// (this is the difference between a swarming run id and request id).
	TaskRunId     string `protobuf:"bytes,5,opt,name=task_run_id,json=task-run-id,proto3" json:"task_run_id,omitempty"`
	TaskRequestId string `protobuf:"bytes,6,opt,name=task_request_id,json=task-request-id,proto3" json:"task_request_id,omitempty"`
	// Note: these URL fields are only populated for -bb runs; eventually,
	// non-bb runs will be deprecated.
	TaskRunUrl  string `protobuf:"bytes,7,opt,name=task_run_url,json=task-run-url,proto3" json:"task_run_url,omitempty"`
	TaskLogsUrl string `protobuf:"bytes,8,opt,name=task_logs_url,json=task-logs-url,proto3" json:"task_logs_url,omitempty"`
}

func (x *WaitTaskResult_Task) Reset() {
	*x = WaitTaskResult_Task{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_tool_result_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *WaitTaskResult_Task) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*WaitTaskResult_Task) ProtoMessage() {}

func (x *WaitTaskResult_Task) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_skylab_tool_result_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use WaitTaskResult_Task.ProtoReflect.Descriptor instead.
func (*WaitTaskResult_Task) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_tool_result_proto_rawDescGZIP(), []int{0, 0}
}

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

func (x *WaitTaskResult_Task) GetState() string {
	if x != nil {
		return x.State
	}
	return ""
}

func (x *WaitTaskResult_Task) GetFailure() bool {
	if x != nil {
		return x.Failure
	}
	return false
}

func (x *WaitTaskResult_Task) GetSuccess() bool {
	if x != nil {
		return x.Success
	}
	return false
}

func (x *WaitTaskResult_Task) GetTaskRunId() string {
	if x != nil {
		return x.TaskRunId
	}
	return ""
}

func (x *WaitTaskResult_Task) GetTaskRequestId() string {
	if x != nil {
		return x.TaskRequestId
	}
	return ""
}

func (x *WaitTaskResult_Task) GetTaskRunUrl() string {
	if x != nil {
		return x.TaskRunUrl
	}
	return ""
}

func (x *WaitTaskResult_Task) GetTaskLogsUrl() string {
	if x != nil {
		return x.TaskLogsUrl
	}
	return ""
}

type WaitTaskResult_LogDataURL struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Deprecated: Do not use.
	IsolateUrl string `protobuf:"bytes,1,opt,name=isolate_url,json=isolateUrl,proto3" json:"isolate_url,omitempty"`
	// Google Storage URL, in full "gs://bucket/foo/bar/baz" form
	GsUrl string `protobuf:"bytes,2,opt,name=gs_url,json=gs-url,proto3" json:"gs_url,omitempty"`
}

func (x *WaitTaskResult_LogDataURL) Reset() {
	*x = WaitTaskResult_LogDataURL{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_skylab_tool_result_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *WaitTaskResult_LogDataURL) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*WaitTaskResult_LogDataURL) ProtoMessage() {}

func (x *WaitTaskResult_LogDataURL) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_skylab_tool_result_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use WaitTaskResult_LogDataURL.ProtoReflect.Descriptor instead.
func (*WaitTaskResult_LogDataURL) Descriptor() ([]byte, []int) {
	return file_test_platform_skylab_tool_result_proto_rawDescGZIP(), []int{0, 1}
}

// Deprecated: Do not use.
func (x *WaitTaskResult_LogDataURL) GetIsolateUrl() string {
	if x != nil {
		return x.IsolateUrl
	}
	return ""
}

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

var File_test_platform_skylab_tool_result_proto protoreflect.FileDescriptor

var file_test_platform_skylab_tool_result_proto_rawDesc = []byte{
	0x0a, 0x26, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x2f, 0x72, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74,
	0x6f, 0x6f, 0x6c, 0x22, 0xed, 0x04, 0x0a, 0x0e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x61, 0x73, 0x6b,
	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x4b, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x6f,
	0x6f, 0x6c, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x72, 0x65, 0x73,
	0x75, 0x6c, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x54, 0x0a, 0x0d, 0x63,
	0x68, 0x69, 0x6c, 0x64, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03,
	0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f,
	0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x6f, 0x6f, 0x6c, 0x2e, 0x57,
	0x61, 0x69, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x54, 0x61,
	0x73, 0x6b, 0x52, 0x0d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x2d, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x73, 0x12, 0x58, 0x0a, 0x0c, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x75, 0x72,
	0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74,
	0x6f, 0x6f, 0x6c, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x2e, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x55, 0x52, 0x4c, 0x52, 0x0c, 0x6c,
	0x6f, 0x67, 0x2d, 0x64, 0x61, 0x74, 0x61, 0x2d, 0x75, 0x72, 0x6c, 0x1a, 0xfa, 0x01, 0x0a, 0x04,
	0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x18,
	0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63,
	0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65,
	0x73, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69,
	0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x72, 0x75,
	0x6e, 0x2d, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x72, 0x65, 0x71,
	0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74,
	0x61, 0x73, 0x6b, 0x2d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2d, 0x69, 0x64, 0x12, 0x22,
	0x0a, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x2d, 0x72, 0x75, 0x6e, 0x2d, 0x75,
	0x72, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x5f,
	0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x2d,
	0x6c, 0x6f, 0x67, 0x73, 0x2d, 0x75, 0x72, 0x6c, 0x1a, 0x49, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x44,
	0x61, 0x74, 0x61, 0x55, 0x52, 0x4c, 0x12, 0x23, 0x0a, 0x0b, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74,
	0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52,
	0x0a, 0x69, 0x73, 0x6f, 0x6c, 0x61, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x67,
	0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x73, 0x2d,
	0x75, 0x72, 0x6c, 0x22, 0x76, 0x0a, 0x0f, 0x57, 0x61, 0x69, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73,
	0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x43, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74,
	0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74,
	0x6f, 0x6f, 0x6c, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75,
	0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69,
	0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0a, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x45, 0x5a, 0x43, 0x67,
	0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c,
	0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x73, 0x6b, 0x79, 0x6c, 0x61, 0x62, 0x5f, 0x74, 0x6f,
	0x6f, 0x6c, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_skylab_tool_result_proto_rawDescOnce sync.Once
	file_test_platform_skylab_tool_result_proto_rawDescData = file_test_platform_skylab_tool_result_proto_rawDesc
)

func file_test_platform_skylab_tool_result_proto_rawDescGZIP() []byte {
	file_test_platform_skylab_tool_result_proto_rawDescOnce.Do(func() {
		file_test_platform_skylab_tool_result_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_skylab_tool_result_proto_rawDescData)
	})
	return file_test_platform_skylab_tool_result_proto_rawDescData
}

var file_test_platform_skylab_tool_result_proto_msgTypes = make([]protoimpl.MessageInfo, 4)
var file_test_platform_skylab_tool_result_proto_goTypes = []interface{}{
	(*WaitTaskResult)(nil),            // 0: test_platform.skylab_tool.WaitTaskResult
	(*WaitTasksResult)(nil),           // 1: test_platform.skylab_tool.WaitTasksResult
	(*WaitTaskResult_Task)(nil),       // 2: test_platform.skylab_tool.WaitTaskResult.Task
	(*WaitTaskResult_LogDataURL)(nil), // 3: test_platform.skylab_tool.WaitTaskResult.LogDataURL
}
var file_test_platform_skylab_tool_result_proto_depIdxs = []int32{
	2, // 0: test_platform.skylab_tool.WaitTaskResult.result:type_name -> test_platform.skylab_tool.WaitTaskResult.Task
	2, // 1: test_platform.skylab_tool.WaitTaskResult.child_results:type_name -> test_platform.skylab_tool.WaitTaskResult.Task
	3, // 2: test_platform.skylab_tool.WaitTaskResult.log_data_url:type_name -> test_platform.skylab_tool.WaitTaskResult.LogDataURL
	0, // 3: test_platform.skylab_tool.WaitTasksResult.results:type_name -> test_platform.skylab_tool.WaitTaskResult
	4, // [4:4] is the sub-list for method output_type
	4, // [4:4] is the sub-list for method input_type
	4, // [4:4] is the sub-list for extension type_name
	4, // [4:4] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_test_platform_skylab_tool_result_proto_init() }
func file_test_platform_skylab_tool_result_proto_init() {
	if File_test_platform_skylab_tool_result_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_skylab_tool_result_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*WaitTaskResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_skylab_tool_result_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*WaitTasksResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_skylab_tool_result_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*WaitTaskResult_Task); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_skylab_tool_result_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*WaitTaskResult_LogDataURL); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_skylab_tool_result_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   4,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_skylab_tool_result_proto_goTypes,
		DependencyIndexes: file_test_platform_skylab_tool_result_proto_depIdxs,
		MessageInfos:      file_test_platform_skylab_tool_result_proto_msgTypes,
	}.Build()
	File_test_platform_skylab_tool_result_proto = out.File
	file_test_platform_skylab_tool_result_proto_rawDesc = nil
	file_test_platform_skylab_tool_result_proto_goTypes = nil
	file_test_platform_skylab_tool_result_proto_depIdxs = nil
}
