// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromite/api/build_api_config.proto

package api

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

// The type of Build API call being made. This allows specifying the desired
// behavior for testing purposes.
type CallType int32

const (
	// None set, treated as a CALL_TYPE_EXECUTE.
	CallType_CALL_TYPE_NONE CallType = 0
	// Call the endpoint normally.
	CallType_CALL_TYPE_EXECUTE CallType = 1
	// Only run validation.
	CallType_CALL_TYPE_VALIDATE_ONLY CallType = 2
	// Get a mock success response without running the endpoint.
	CallType_CALL_TYPE_MOCK_SUCCESS CallType = 3
	// Get a mock failure response without running the endpoint.
	CallType_CALL_TYPE_MOCK_FAILURE CallType = 4
	// Get a mock invalid input response without running the validation.
	CallType_CALL_TYPE_MOCK_INVALID CallType = 5
)

// Enum value maps for CallType.
var (
	CallType_name = map[int32]string{
		0: "CALL_TYPE_NONE",
		1: "CALL_TYPE_EXECUTE",
		2: "CALL_TYPE_VALIDATE_ONLY",
		3: "CALL_TYPE_MOCK_SUCCESS",
		4: "CALL_TYPE_MOCK_FAILURE",
		5: "CALL_TYPE_MOCK_INVALID",
	}
	CallType_value = map[string]int32{
		"CALL_TYPE_NONE":          0,
		"CALL_TYPE_EXECUTE":       1,
		"CALL_TYPE_VALIDATE_ONLY": 2,
		"CALL_TYPE_MOCK_SUCCESS":  3,
		"CALL_TYPE_MOCK_FAILURE":  4,
		"CALL_TYPE_MOCK_INVALID":  5,
	}
)

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

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

func (CallType) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_build_api_config_proto_enumTypes[0].Descriptor()
}

func (CallType) Type() protoreflect.EnumType {
	return &file_chromite_api_build_api_config_proto_enumTypes[0]
}

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

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

// The config message itself. This is the message passed to the Build API's
// config option.
type BuildApiConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The logs are always sent to stdout. Setting this log path allows also
	// sending the logs to a file (i.e. tee-ing the logs).
	LogPath string `protobuf:"bytes,1,opt,name=log_path,json=logPath,proto3" json:"log_path,omitempty"`
	// The type of call being made. By default the endpoint will execute
	// normally, but other testing execution modes can be enabled that help
	// test API consumer code.
	CallType CallType `protobuf:"varint,2,opt,name=call_type,json=callType,proto3,enum=chromite.api.CallType" json:"call_type,omitempty"`
}

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

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

func (*BuildApiConfig) ProtoMessage() {}

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

func (x *BuildApiConfig) GetLogPath() string {
	if x != nil {
		return x.LogPath
	}
	return ""
}

func (x *BuildApiConfig) GetCallType() CallType {
	if x != nil {
		return x.CallType
	}
	return CallType_CALL_TYPE_NONE
}

var File_chromite_api_build_api_config_proto protoreflect.FileDescriptor

var file_chromite_api_build_api_config_proto_rawDesc = []byte{
	0x0a, 0x23, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e,
	0x61, 0x70, 0x69, 0x22, 0x60, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x70, 0x69, 0x43,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x70, 0x61, 0x74,
	0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x50, 0x61, 0x74, 0x68,
	0x12, 0x33, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x63, 0x61, 0x6c,
	0x6c, 0x54, 0x79, 0x70, 0x65, 0x2a, 0xa6, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x6c, 0x6c, 0x54, 0x79,
	0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
	0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x54,
	0x59, 0x50, 0x45, 0x5f, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x45, 0x10, 0x01, 0x12, 0x1b, 0x0a,
	0x17, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x56, 0x41, 0x4c, 0x49, 0x44,
	0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x41,
	0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x43, 0x4b, 0x5f, 0x53, 0x55, 0x43,
	0x43, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x54,
	0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45,
	0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x41, 0x4c, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f,
	0x4d, 0x4f, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x05, 0x42, 0x38,
	0x5a, 0x36, 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, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_build_api_config_proto_rawDescOnce sync.Once
	file_chromite_api_build_api_config_proto_rawDescData = file_chromite_api_build_api_config_proto_rawDesc
)

func file_chromite_api_build_api_config_proto_rawDescGZIP() []byte {
	file_chromite_api_build_api_config_proto_rawDescOnce.Do(func() {
		file_chromite_api_build_api_config_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_build_api_config_proto_rawDescData)
	})
	return file_chromite_api_build_api_config_proto_rawDescData
}

var file_chromite_api_build_api_config_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
var file_chromite_api_build_api_config_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_chromite_api_build_api_config_proto_goTypes = []interface{}{
	(CallType)(0),          // 0: chromite.api.CallType
	(*BuildApiConfig)(nil), // 1: chromite.api.BuildApiConfig
}
var file_chromite_api_build_api_config_proto_depIdxs = []int32{
	0, // 0: chromite.api.BuildApiConfig.call_type:type_name -> chromite.api.CallType
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_chromite_api_build_api_config_proto_init() }
func file_chromite_api_build_api_config_proto_init() {
	if File_chromite_api_build_api_config_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_build_api_config_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildApiConfig); 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_chromite_api_build_api_config_proto_rawDesc,
			NumEnums:      1,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromite_api_build_api_config_proto_goTypes,
		DependencyIndexes: file_chromite_api_build_api_config_proto_depIdxs,
		EnumInfos:         file_chromite_api_build_api_config_proto_enumTypes,
		MessageInfos:      file_chromite_api_build_api_config_proto_msgTypes,
	}.Build()
	File_chromite_api_build_api_config_proto = out.File
	file_chromite_api_build_api_config_proto_rawDesc = nil
	file_chromite_api_build_api_config_proto_goTypes = nil
	file_chromite_api_build_api_config_proto_depIdxs = nil
}
