// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/build_api_config.proto

package api

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

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

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",
}

var 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) String() string {
	return proto.EnumName(CallType_name, int32(x))
}

func (CallType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_1d485d7e27758942, []int{0}
}

// The config message itself. This is the message passed to the Build API's
// config option.
type BuildApiConfig struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_BuildApiConfig proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterEnum("chromite.api.CallType", CallType_name, CallType_value)
	proto.RegisterType((*BuildApiConfig)(nil), "chromite.api.BuildApiConfig")
}

func init() {
	proto.RegisterFile("chromite/api/build_api_config.proto", fileDescriptor_1d485d7e27758942)
}

var fileDescriptor_1d485d7e27758942 = []byte{
	// 283 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x4d, 0x4b, 0xc3, 0x30,
	0x1c, 0xc6, 0xed, 0x7c, 0xdb, 0x82, 0x94, 0x18, 0x70, 0x4e, 0xbd, 0x0c, 0xbd, 0x0c, 0x0f, 0x0d,
	0x38, 0x10, 0xaf, 0x5d, 0x8c, 0x50, 0xac, 0xed, 0xe8, 0x8b, 0x38, 0x2f, 0x31, 0xab, 0x5d, 0x1a,
	0xc8, 0x96, 0x50, 0xbb, 0xc3, 0xbe, 0x90, 0x9f, 0x53, 0x2c, 0x2b, 0xdd, 0x61, 0xb7, 0xe4, 0xf7,
	0xfc, 0x78, 0xe0, 0xff, 0x80, 0xbb, 0xac, 0x28, 0xf5, 0x52, 0x56, 0x39, 0xe6, 0x46, 0xe2, 0xf9,
	0x5a, 0xaa, 0x6f, 0xc6, 0x8d, 0x64, 0x99, 0x5e, 0x2d, 0xa4, 0x70, 0x4c, 0xa9, 0x2b, 0x8d, 0xce,
	0x1a, 0xc9, 0xe1, 0x46, 0xde, 0x7e, 0x01, 0x7b, 0xf2, 0xef, 0xb9, 0x46, 0x92, 0xda, 0x42, 0x57,
	0xa0, 0xab, 0xb4, 0x60, 0x86, 0x57, 0xc5, 0xc0, 0x1a, 0x5a, 0xa3, 0x5e, 0x74, 0xaa, 0xb4, 0x98,
	0xf2, 0xaa, 0x40, 0x63, 0xd0, 0xcb, 0xb8, 0x52, 0xac, 0xda, 0x98, 0x7c, 0xd0, 0x19, 0x5a, 0x23,
	0xfb, 0xa1, 0xef, 0xec, 0xd6, 0x39, 0x84, 0x2b, 0x95, 0x6c, 0x4c, 0x1e, 0x75, 0xb3, 0xed, 0xeb,
	0xfe, 0xd7, 0x02, 0xdd, 0x06, 0x23, 0x04, 0x6c, 0xe2, 0xfa, 0x3e, 0x4b, 0x66, 0x53, 0xca, 0x82,
	0x30, 0xa0, 0xf0, 0x00, 0x5d, 0x80, 0xf3, 0x96, 0xd1, 0x0f, 0x4a, 0xd2, 0x84, 0x42, 0x0b, 0xdd,
	0x80, 0xcb, 0x16, 0xbf, 0xbb, 0xbe, 0xf7, 0xec, 0x26, 0x94, 0x85, 0x81, 0x3f, 0x83, 0x1d, 0x74,
	0x0d, 0xfa, 0x6d, 0xf8, 0x16, 0x92, 0x57, 0x16, 0xa7, 0x84, 0xd0, 0x38, 0x86, 0x87, 0x7b, 0xb2,
	0x17, 0xd7, 0xf3, 0xd3, 0x88, 0xc2, 0xa3, 0x3d, 0x99, 0x17, 0xd4, 0xdd, 0xf0, 0x78, 0xf2, 0xf4,
	0xf9, 0x28, 0xf4, 0xf6, 0x9c, 0xf5, 0xd2, 0xd1, 0xa5, 0xc0, 0xcd, 0x47, 0xff, 0x60, 0xb9, 0x5a,
	0x94, 0x1c, 0xd7, 0x13, 0x62, 0xa1, 0xf1, 0xee, 0xd2, 0xf3, 0x93, 0x1a, 0x8f, 0xff, 0x02, 0x00,
	0x00, 0xff, 0xff, 0x20, 0xdd, 0x1d, 0xce, 0x80, 0x01, 0x00, 0x00,
}
