// Copyright 2020 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/result_flow/common.proto

package result_flow

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)
)

// Values should be consistent with https://aip.dev/216
type State int32

const (
	// Should not be used.
	State_STATE_UNSPECIFIED State = 0
	// Successfully executed the command.
	State_SUCCEEDED State = 1
	// Encountered failure during the run.
	State_FAILED State = 2
	// The command has hit the predefined deadline.
	State_TIMED_OUT State = 3
	// The command was aborted externally.
	State_ABORTED State = 4
)

// Enum value maps for State.
var (
	State_name = map[int32]string{
		0: "STATE_UNSPECIFIED",
		1: "SUCCEEDED",
		2: "FAILED",
		3: "TIMED_OUT",
		4: "ABORTED",
	}
	State_value = map[string]int32{
		"STATE_UNSPECIFIED": 0,
		"SUCCEEDED":         1,
		"FAILED":            2,
		"TIMED_OUT":         3,
		"ABORTED":           4,
	}
)

func (x State) Enum() *State {
	p := new(State)
	*p = x
	return p
}

func (x State) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (State) Descriptor() protoreflect.EnumDescriptor {
	return file_test_platform_result_flow_common_proto_enumTypes[0].Descriptor()
}

func (State) Type() protoreflect.EnumType {
	return &file_test_platform_result_flow_common_proto_enumTypes[0]
}

func (x State) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use State.Descriptor instead.
func (State) EnumDescriptor() ([]byte, []int) {
	return file_test_platform_result_flow_common_proto_rawDescGZIP(), []int{0}
}

// PubSubConfig contains the config to interact with Pub/Sub.
type PubSubConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Project              string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	Topic                string `protobuf:"bytes,2,opt,name=topic,proto3" json:"topic,omitempty"`
	Subscription         string `protobuf:"bytes,3,opt,name=subscription,proto3" json:"subscription,omitempty"`
	MaxReceivingMessages int32  `protobuf:"varint,4,opt,name=max_receiving_messages,json=maxReceivingMessages,proto3" json:"max_receiving_messages,omitempty"`
}

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

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

func (*PubSubConfig) ProtoMessage() {}

func (x *PubSubConfig) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_common_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 PubSubConfig.ProtoReflect.Descriptor instead.
func (*PubSubConfig) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_common_proto_rawDescGZIP(), []int{0}
}

func (x *PubSubConfig) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *PubSubConfig) GetTopic() string {
	if x != nil {
		return x.Topic
	}
	return ""
}

func (x *PubSubConfig) GetSubscription() string {
	if x != nil {
		return x.Subscription
	}
	return ""
}

func (x *PubSubConfig) GetMaxReceivingMessages() int32 {
	if x != nil {
		return x.MaxReceivingMessages
	}
	return 0
}

// BuildbucketConfig contains the config to interact with Buildbucket.
type BuildbucketConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Host    string `protobuf:"bytes,1,opt,name=host,proto3" json:"host,omitempty"`
	Project string `protobuf:"bytes,2,opt,name=project,proto3" json:"project,omitempty"`
	Bucket  string `protobuf:"bytes,3,opt,name=bucket,proto3" json:"bucket,omitempty"`
	Builder string `protobuf:"bytes,4,opt,name=builder,proto3" json:"builder,omitempty"`
}

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

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

func (*BuildbucketConfig) ProtoMessage() {}

func (x *BuildbucketConfig) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_common_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 BuildbucketConfig.ProtoReflect.Descriptor instead.
func (*BuildbucketConfig) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_common_proto_rawDescGZIP(), []int{1}
}

func (x *BuildbucketConfig) GetHost() string {
	if x != nil {
		return x.Host
	}
	return ""
}

func (x *BuildbucketConfig) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *BuildbucketConfig) GetBucket() string {
	if x != nil {
		return x.Bucket
	}
	return ""
}

func (x *BuildbucketConfig) GetBuilder() string {
	if x != nil {
		return x.Builder
	}
	return ""
}

// BigqueryConfig contains the config to interact with Bigquery.
type BigqueryConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"`
	Dataset string `protobuf:"bytes,2,opt,name=dataset,proto3" json:"dataset,omitempty"`
	Table   string `protobuf:"bytes,3,opt,name=table,proto3" json:"table,omitempty"`
}

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

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

func (*BigqueryConfig) ProtoMessage() {}

func (x *BigqueryConfig) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_common_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 BigqueryConfig.ProtoReflect.Descriptor instead.
func (*BigqueryConfig) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_common_proto_rawDescGZIP(), []int{2}
}

func (x *BigqueryConfig) GetProject() string {
	if x != nil {
		return x.Project
	}
	return ""
}

func (x *BigqueryConfig) GetDataset() string {
	if x != nil {
		return x.Dataset
	}
	return ""
}

func (x *BigqueryConfig) GetTable() string {
	if x != nil {
		return x.Table
	}
	return ""
}

// Source is a wrapper for the source side configuration.
type Source struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Pubsub *PubSubConfig      `protobuf:"bytes,1,opt,name=pubsub,proto3" json:"pubsub,omitempty"`
	Bb     *BuildbucketConfig `protobuf:"bytes,2,opt,name=bb,proto3" json:"bb,omitempty"`
	Fields []string           `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"`
}

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

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

func (*Source) ProtoMessage() {}

func (x *Source) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_common_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 Source.ProtoReflect.Descriptor instead.
func (*Source) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_common_proto_rawDescGZIP(), []int{3}
}

func (x *Source) GetPubsub() *PubSubConfig {
	if x != nil {
		return x.Pubsub
	}
	return nil
}

func (x *Source) GetBb() *BuildbucketConfig {
	if x != nil {
		return x.Bb
	}
	return nil
}

func (x *Source) GetFields() []string {
	if x != nil {
		return x.Fields
	}
	return nil
}

// Target is a wrapper for the target side configuration.
type Target struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Bq *BigqueryConfig `protobuf:"bytes,1,opt,name=bq,proto3" json:"bq,omitempty"`
}

func (x *Target) Reset() {
	*x = Target{}
	if protoimpl.UnsafeEnabled {
		mi := &file_test_platform_result_flow_common_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Target) ProtoMessage() {}

func (x *Target) ProtoReflect() protoreflect.Message {
	mi := &file_test_platform_result_flow_common_proto_msgTypes[4]
	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 Target.ProtoReflect.Descriptor instead.
func (*Target) Descriptor() ([]byte, []int) {
	return file_test_platform_result_flow_common_proto_rawDescGZIP(), []int{4}
}

func (x *Target) GetBq() *BigqueryConfig {
	if x != nil {
		return x.Bq
	}
	return nil
}

var File_test_platform_result_flow_common_proto protoreflect.FileDescriptor

var file_test_platform_result_flow_common_proto_rawDesc = []byte{
	0x0a, 0x26, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x19, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66,
	0x6c, 0x6f, 0x77, 0x22, 0x98, 0x01, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x14,
	0x0a, 0x05, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
	0x6f, 0x70, 0x69, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70,
	0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x62, 0x73,
	0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f,
	0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67,
	0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x63,
	0x65, 0x69, 0x76, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x73,
	0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65,
	0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63,
	0x74, 0x12, 0x16, 0x0a, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x06, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c,
	0x64, 0x65, 0x72, 0x22, 0x5a, 0x0a, 0x0e, 0x42, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12,
	0x18, 0x0a, 0x07, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x07, 0x64, 0x61, 0x74, 0x61, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62,
	0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x22,
	0x9f, 0x01, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x75,
	0x62, 0x73, 0x75, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x5f, 0x66, 0x6c, 0x6f, 0x77, 0x2e, 0x50, 0x75, 0x62, 0x53, 0x75, 0x62, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x06, 0x70, 0x75, 0x62, 0x73, 0x75, 0x62, 0x12, 0x3c, 0x0a, 0x02, 0x62,
	0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66,
	0x6c, 0x6f, 0x77, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x02, 0x62, 0x62, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65,
	0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64,
	0x73, 0x22, 0x43, 0x0a, 0x06, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x39, 0x0a, 0x02, 0x62,
	0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f, 0x66,
	0x6c, 0x6f, 0x77, 0x2e, 0x42, 0x69, 0x67, 0x71, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x52, 0x02, 0x62, 0x71, 0x2a, 0x55, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12,
	0x15, 0x0a, 0x11, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49,
	0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45,
	0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10,
	0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x49, 0x4d, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x03,
	0x12, 0x0b, 0x0a, 0x07, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x04, 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, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x5f,
	0x66, 0x6c, 0x6f, 0x77, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_result_flow_common_proto_rawDescOnce sync.Once
	file_test_platform_result_flow_common_proto_rawDescData = file_test_platform_result_flow_common_proto_rawDesc
)

func file_test_platform_result_flow_common_proto_rawDescGZIP() []byte {
	file_test_platform_result_flow_common_proto_rawDescOnce.Do(func() {
		file_test_platform_result_flow_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_result_flow_common_proto_rawDescData)
	})
	return file_test_platform_result_flow_common_proto_rawDescData
}

var file_test_platform_result_flow_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_test_platform_result_flow_common_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
var file_test_platform_result_flow_common_proto_goTypes = []interface{}{
	(State)(0),                // 0: test_platform.result_flow.State
	(*PubSubConfig)(nil),      // 1: test_platform.result_flow.PubSubConfig
	(*BuildbucketConfig)(nil), // 2: test_platform.result_flow.BuildbucketConfig
	(*BigqueryConfig)(nil),    // 3: test_platform.result_flow.BigqueryConfig
	(*Source)(nil),            // 4: test_platform.result_flow.Source
	(*Target)(nil),            // 5: test_platform.result_flow.Target
}
var file_test_platform_result_flow_common_proto_depIdxs = []int32{
	1, // 0: test_platform.result_flow.Source.pubsub:type_name -> test_platform.result_flow.PubSubConfig
	2, // 1: test_platform.result_flow.Source.bb:type_name -> test_platform.result_flow.BuildbucketConfig
	3, // 2: test_platform.result_flow.Target.bq:type_name -> test_platform.result_flow.BigqueryConfig
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	3, // [3:3] is the sub-list for extension type_name
	3, // [3:3] is the sub-list for extension extendee
	0, // [0:3] is the sub-list for field type_name
}

func init() { file_test_platform_result_flow_common_proto_init() }
func file_test_platform_result_flow_common_proto_init() {
	if File_test_platform_result_flow_common_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_test_platform_result_flow_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PubSubConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildbucketConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BigqueryConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_common_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Source); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_test_platform_result_flow_common_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Target); 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_result_flow_common_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   5,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_result_flow_common_proto_goTypes,
		DependencyIndexes: file_test_platform_result_flow_common_proto_depIdxs,
		EnumInfos:         file_test_platform_result_flow_common_proto_enumTypes,
		MessageInfos:      file_test_platform_result_flow_common_proto_msgTypes,
	}.Build()
	File_test_platform_result_flow_common_proto = out.File
	file_test_platform_result_flow_common_proto_rawDesc = nil
	file_test_platform_result_flow_common_proto_goTypes = nil
	file_test_platform_result_flow_common_proto_depIdxs = nil
}
