// Custom option defs must be proto2 syntax.

// 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.proto

package api

import (
	descriptor "github.com/golang/protobuf/protoc-gen-go/descriptor"
	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)
)

// Config to allow chroot assertions to be made via service/method options.
type ChrootAssertion int32

const (
	ChrootAssertion_NO_ASSERTION ChrootAssertion = 0
	ChrootAssertion_INSIDE       ChrootAssertion = 1
	ChrootAssertion_OUTSIDE      ChrootAssertion = 2
)

// Enum value maps for ChrootAssertion.
var (
	ChrootAssertion_name = map[int32]string{
		0: "NO_ASSERTION",
		1: "INSIDE",
		2: "OUTSIDE",
	}
	ChrootAssertion_value = map[string]int32{
		"NO_ASSERTION": 0,
		"INSIDE":       1,
		"OUTSIDE":      2,
	}
)

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

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

func (ChrootAssertion) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_build_api_proto_enumTypes[0].Descriptor()
}

func (ChrootAssertion) Type() protoreflect.EnumType {
	return &file_chromite_api_build_api_proto_enumTypes[0]
}

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

// Deprecated: Do not use.
func (x *ChrootAssertion) UnmarshalJSON(b []byte) error {
	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
	if err != nil {
		return err
	}
	*x = ChrootAssertion(num)
	return nil
}

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

// Allows setting services or endpoints to invisible in the methods listing.
// Services/endpoints that are hidden can still be called, they just won't
// appear in MethodService/Get.
type ListVisibility int32

const (
	ListVisibility_LV_NOT_SPECIFIED ListVisibility = 0
	ListVisibility_LV_VISIBLE       ListVisibility = 1
	ListVisibility_LV_HIDDEN        ListVisibility = 2
)

// Enum value maps for ListVisibility.
var (
	ListVisibility_name = map[int32]string{
		0: "LV_NOT_SPECIFIED",
		1: "LV_VISIBLE",
		2: "LV_HIDDEN",
	}
	ListVisibility_value = map[string]int32{
		"LV_NOT_SPECIFIED": 0,
		"LV_VISIBLE":       1,
		"LV_HIDDEN":        2,
	}
)

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

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

func (ListVisibility) Descriptor() protoreflect.EnumDescriptor {
	return file_chromite_api_build_api_proto_enumTypes[1].Descriptor()
}

func (ListVisibility) Type() protoreflect.EnumType {
	return &file_chromite_api_build_api_proto_enumTypes[1]
}

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

// Deprecated: Do not use.
func (x *ListVisibility) UnmarshalJSON(b []byte) error {
	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
	if err != nil {
		return err
	}
	*x = ListVisibility(num)
	return nil
}

// Deprecated: Use ListVisibility.Descriptor instead.
func (ListVisibility) EnumDescriptor() ([]byte, []int) {
	return file_chromite_api_build_api_proto_rawDescGZIP(), []int{1}
}

// Custom Service options.
type BuildApiServiceOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The name of the controller module implementing the service.
	Module *string `protobuf:"bytes,1,req,name=module" json:"module,omitempty"`
	// Assert any methods in the service are run inside/outside the chroot when
	// specified, unless overridden by the method config.
	ServiceChrootAssert *ChrootAssertion `protobuf:"varint,2,opt,name=service_chroot_assert,json=serviceChrootAssert,enum=ChrootAssertion" json:"service_chroot_assert,omitempty"`
	// Set to LV_INVISIBLE to hide the entire service from the methods listing.
	ServiceVisibility *ListVisibility `protobuf:"varint,3,opt,name=service_visibility,json=serviceVisibility,enum=ListVisibility" json:"service_visibility,omitempty"`
}

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

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

func (*BuildApiServiceOptions) ProtoMessage() {}

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

func (x *BuildApiServiceOptions) GetModule() string {
	if x != nil && x.Module != nil {
		return *x.Module
	}
	return ""
}

func (x *BuildApiServiceOptions) GetServiceChrootAssert() ChrootAssertion {
	if x != nil && x.ServiceChrootAssert != nil {
		return *x.ServiceChrootAssert
	}
	return ChrootAssertion_NO_ASSERTION
}

func (x *BuildApiServiceOptions) GetServiceVisibility() ListVisibility {
	if x != nil && x.ServiceVisibility != nil {
		return *x.ServiceVisibility
	}
	return ListVisibility_LV_NOT_SPECIFIED
}

// Custom Method options.
type BuildApiMethodOptions struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The name of the function implementing the method if different than the
	// method name defined in the .proto.
	ImplementationName *string `protobuf:"bytes,1,opt,name=implementation_name,json=implementationName" json:"implementation_name,omitempty"`
	// Assert the method is run inside/outside the chroot when specified,
	// overriding the service config when set.
	MethodChrootAssert *ChrootAssertion `protobuf:"varint,2,opt,name=method_chroot_assert,json=methodChrootAssert,enum=ChrootAssertion" json:"method_chroot_assert,omitempty"`
	// Set to LV_INVISIBLE to hide the entire service from the methods listing.
	MethodVisibility *ListVisibility `protobuf:"varint,3,opt,name=method_visibility,json=methodVisibility,enum=ListVisibility" json:"method_visibility,omitempty"`
}

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

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

func (*BuildApiMethodOptions) ProtoMessage() {}

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

func (x *BuildApiMethodOptions) GetImplementationName() string {
	if x != nil && x.ImplementationName != nil {
		return *x.ImplementationName
	}
	return ""
}

func (x *BuildApiMethodOptions) GetMethodChrootAssert() ChrootAssertion {
	if x != nil && x.MethodChrootAssert != nil {
		return *x.MethodChrootAssert
	}
	return ChrootAssertion_NO_ASSERTION
}

func (x *BuildApiMethodOptions) GetMethodVisibility() ListVisibility {
	if x != nil && x.MethodVisibility != nil {
		return *x.MethodVisibility
	}
	return ListVisibility_LV_NOT_SPECIFIED
}

var file_chromite_api_build_api_proto_extTypes = []protoimpl.ExtensionInfo{
	{
		ExtendedType:  (*descriptor.ServiceOptions)(nil),
		ExtensionType: (*BuildApiServiceOptions)(nil),
		Field:         55000,
		Name:          "service_options",
		Tag:           "bytes,55000,opt,name=service_options",
		Filename:      "chromite/api/build_api.proto",
	},
	{
		ExtendedType:  (*descriptor.MethodOptions)(nil),
		ExtensionType: (*BuildApiMethodOptions)(nil),
		Field:         55000,
		Name:          "method_options",
		Tag:           "bytes,55000,opt,name=method_options",
		Filename:      "chromite/api/build_api.proto",
	},
}

// Extension fields to descriptor.ServiceOptions.
var (
	// optional BuildApiServiceOptions service_options = 55000;
	E_ServiceOptions = &file_chromite_api_build_api_proto_extTypes[0]
)

// Extension fields to descriptor.MethodOptions.
var (
	// optional BuildApiMethodOptions method_options = 55000;
	E_MethodOptions = &file_chromite_api_build_api_proto_extTypes[1]
)

var File_chromite_api_build_api_proto protoreflect.FileDescriptor

var file_chromite_api_build_api_proto_rawDesc = []byte{
	0x0a, 0x1c, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62,
	0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f,
	0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
	0x22, 0xb6, 0x01, 0x0a, 0x16, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41, 0x70, 0x69, 0x53, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d,
	0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x6f, 0x64,
	0x75, 0x6c, 0x65, 0x12, 0x44, 0x0a, 0x15, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63,
	0x68, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x10, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x72,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x43, 0x68, 0x72,
	0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x12, 0x3e, 0x0a, 0x12, 0x73, 0x65, 0x72,
	0x76, 0x69, 0x63, 0x65, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18,
	0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x69, 0x73, 0x69,
	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x56,
	0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xca, 0x01, 0x0a, 0x15, 0x42, 0x75,
	0x69, 0x6c, 0x64, 0x41, 0x70, 0x69, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69,
	0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74,
	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x12, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x4e, 0x61, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x14, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x63,
	0x68, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x10, 0x2e, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x72,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x43, 0x68, 0x72, 0x6f,
	0x6f, 0x74, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x12, 0x3c, 0x0a, 0x11, 0x6d, 0x65, 0x74, 0x68,
	0x6f, 0x64, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x69, 0x73, 0x69, 0x62, 0x69,
	0x6c, 0x69, 0x74, 0x79, 0x52, 0x10, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x56, 0x69, 0x73, 0x69,
	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2a, 0x3c, 0x0a, 0x0f, 0x43, 0x68, 0x72, 0x6f, 0x6f, 0x74,
	0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x5f,
	0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x49,
	0x4e, 0x53, 0x49, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x55, 0x54, 0x53, 0x49,
	0x44, 0x45, 0x10, 0x02, 0x2a, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x69, 0x73, 0x69,
	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x56, 0x5f, 0x4e, 0x4f, 0x54,
	0x5f, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a,
	0x4c, 0x56, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09,
	0x4c, 0x56, 0x5f, 0x48, 0x49, 0x44, 0x44, 0x45, 0x4e, 0x10, 0x02, 0x3a, 0x63, 0x0a, 0x0f, 0x73,
	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
	0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18,
	0xd8, 0xad, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x41,
	0x70, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x3a, 0x5f, 0x0a, 0x0e, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x12, 0x1e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x18, 0xd8, 0xad, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x42, 0x75, 0x69,
	0x6c, 0x64, 0x41, 0x70, 0x69, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f,
	0x6e, 0x73, 0x52, 0x0d, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e,
	0x73, 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,
}

var (
	file_chromite_api_build_api_proto_rawDescOnce sync.Once
	file_chromite_api_build_api_proto_rawDescData = file_chromite_api_build_api_proto_rawDesc
)

func file_chromite_api_build_api_proto_rawDescGZIP() []byte {
	file_chromite_api_build_api_proto_rawDescOnce.Do(func() {
		file_chromite_api_build_api_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_build_api_proto_rawDescData)
	})
	return file_chromite_api_build_api_proto_rawDescData
}

var file_chromite_api_build_api_proto_enumTypes = make([]protoimpl.EnumInfo, 2)
var file_chromite_api_build_api_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_chromite_api_build_api_proto_goTypes = []interface{}{
	(ChrootAssertion)(0),              // 0: ChrootAssertion
	(ListVisibility)(0),               // 1: ListVisibility
	(*BuildApiServiceOptions)(nil),    // 2: BuildApiServiceOptions
	(*BuildApiMethodOptions)(nil),     // 3: BuildApiMethodOptions
	(*descriptor.ServiceOptions)(nil), // 4: google.protobuf.ServiceOptions
	(*descriptor.MethodOptions)(nil),  // 5: google.protobuf.MethodOptions
}
var file_chromite_api_build_api_proto_depIdxs = []int32{
	0, // 0: BuildApiServiceOptions.service_chroot_assert:type_name -> ChrootAssertion
	1, // 1: BuildApiServiceOptions.service_visibility:type_name -> ListVisibility
	0, // 2: BuildApiMethodOptions.method_chroot_assert:type_name -> ChrootAssertion
	1, // 3: BuildApiMethodOptions.method_visibility:type_name -> ListVisibility
	4, // 4: service_options:extendee -> google.protobuf.ServiceOptions
	5, // 5: method_options:extendee -> google.protobuf.MethodOptions
	2, // 6: service_options:type_name -> BuildApiServiceOptions
	3, // 7: method_options:type_name -> BuildApiMethodOptions
	8, // [8:8] is the sub-list for method output_type
	8, // [8:8] is the sub-list for method input_type
	6, // [6:8] is the sub-list for extension type_name
	4, // [4:6] is the sub-list for extension extendee
	0, // [0:4] is the sub-list for field type_name
}

func init() { file_chromite_api_build_api_proto_init() }
func file_chromite_api_build_api_proto_init() {
	if File_chromite_api_build_api_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_build_api_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildApiServiceOptions); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_build_api_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*BuildApiMethodOptions); 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_proto_rawDesc,
			NumEnums:      2,
			NumMessages:   2,
			NumExtensions: 2,
			NumServices:   0,
		},
		GoTypes:           file_chromite_api_build_api_proto_goTypes,
		DependencyIndexes: file_chromite_api_build_api_proto_depIdxs,
		EnumInfos:         file_chromite_api_build_api_proto_enumTypes,
		MessageInfos:      file_chromite_api_build_api_proto_msgTypes,
		ExtensionInfos:    file_chromite_api_build_api_proto_extTypes,
	}.Build()
	File_chromite_api_build_api_proto = out.File
	file_chromite_api_build_api_proto_rawDesc = nil
	file_chromite_api_build_api_proto_goTypes = nil
	file_chromite_api_build_api_proto_depIdxs = nil
}
