// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.1.0
// - protoc             v3.17.1
// source: chromite/api/artifacts.proto

package api

import (
	context "context"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
)

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7

// ArtifactsServiceClient is the client API for ArtifactsService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
type ArtifactsServiceClient interface {
	// Perform pre-build setup for artifact builds.  Added in R90.
	BuildSetup(ctx context.Context, in *BuildSetupRequest, opts ...grpc.CallOption) (*BuildSetupResponse, error)
	// Get artifacts for build. Added in R90.
	Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error)
	// Fetch the pinned guest image locations.  Added in R77.
	FetchPinnedGuestImageUris(ctx context.Context, in *PinnedGuestImageUriRequest, opts ...grpc.CallOption) (*PinnedGuestImageUriResponse, error)
	// Fetch the paths for any metadata files.  Added in R94.
	FetchMetadata(ctx context.Context, in *FetchMetadataRequest, opts ...grpc.CallOption) (*FetchMetadataResponse, error)
	// Fetch the paths for any centralized suite files.  Added in R123.
	FetchCentralizedSuites(ctx context.Context, in *FetchCentralizedSuitesRequest, opts ...grpc.CallOption) (*FetchCentralizedSuitesResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create the ChromeOS Config JSON payload.  Added in R78.
	BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive of debug symbols.  Added in R90.
	BundleDebugSymbols(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar.xz archive for each image that has been created.
	// Added in R79.
	BundleImageArchives(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Generate zip containing all built images for the target.
	BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(ctx context.Context, in *BundleVmFilesRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	// Added in R88.
	BundleFpmcuUnittests(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tarball from the test image suitable for importing into GCE.
	// Added in R89.
	BundleGceTarball(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
}

type artifactsServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewArtifactsServiceClient(cc grpc.ClientConnInterface) ArtifactsServiceClient {
	return &artifactsServiceClient{cc}
}

func (c *artifactsServiceClient) BuildSetup(ctx context.Context, in *BuildSetupRequest, opts ...grpc.CallOption) (*BuildSetupResponse, error) {
	out := new(BuildSetupResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BuildSetup", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) Get(ctx context.Context, in *GetRequest, opts ...grpc.CallOption) (*GetResponse, error) {
	out := new(GetResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/Get", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) FetchPinnedGuestImageUris(ctx context.Context, in *PinnedGuestImageUriRequest, opts ...grpc.CallOption) (*PinnedGuestImageUriResponse, error) {
	out := new(PinnedGuestImageUriResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/FetchPinnedGuestImageUris", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) FetchMetadata(ctx context.Context, in *FetchMetadataRequest, opts ...grpc.CallOption) (*FetchMetadataResponse, error) {
	out := new(FetchMetadataResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/FetchMetadata", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) FetchCentralizedSuites(ctx context.Context, in *FetchCentralizedSuitesRequest, opts ...grpc.CallOption) (*FetchCentralizedSuitesResponse, error) {
	out := new(FetchCentralizedSuitesResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/FetchCentralizedSuites", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleAutotestFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleAutotestFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleChromeOSConfig", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleDebugSymbols(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleDebugSymbols", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleEbuildLogs", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleImageArchives(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleImageArchives", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleImageZip", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundlePinnedGuestImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundlePinnedGuestImages", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleSimpleChromeArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleTastFiles(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleTastFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleTestUpdatePayloads(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleTestUpdatePayloads", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleVmFiles(ctx context.Context, in *BundleVmFilesRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleVmFiles", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleFpmcuUnittests(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleFpmcuUnittests", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *artifactsServiceClient) BundleGceTarball(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleGceTarball", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// ArtifactsServiceServer is the server API for ArtifactsService service.
// All implementations must embed UnimplementedArtifactsServiceServer
// for forward compatibility
type ArtifactsServiceServer interface {
	// Perform pre-build setup for artifact builds.  Added in R90.
	BuildSetup(context.Context, *BuildSetupRequest) (*BuildSetupResponse, error)
	// Get artifacts for build. Added in R90.
	Get(context.Context, *GetRequest) (*GetResponse, error)
	// Fetch the pinned guest image locations.  Added in R77.
	FetchPinnedGuestImageUris(context.Context, *PinnedGuestImageUriRequest) (*PinnedGuestImageUriResponse, error)
	// Fetch the paths for any metadata files.  Added in R94.
	FetchMetadata(context.Context, *FetchMetadataRequest) (*FetchMetadataResponse, error)
	// Fetch the paths for any centralized suite files.  Added in R123.
	FetchCentralizedSuites(context.Context, *FetchCentralizedSuitesRequest) (*FetchCentralizedSuitesResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create the ChromeOS Config JSON payload.  Added in R78.
	BundleChromeOSConfig(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive of debug symbols.  Added in R90.
	BundleDebugSymbols(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar.xz archive for each image that has been created.
	// Added in R79.
	BundleImageArchives(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Generate zip containing all built images for the target.
	BundleImageZip(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(context.Context, *BundleVmFilesRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	// Added in R88.
	BundleFpmcuUnittests(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(b/187790484): DEPRECATED use Get
	// Create a tarball from the test image suitable for importing into GCE.
	// Added in R89.
	BundleGceTarball(context.Context, *BundleRequest) (*BundleResponse, error)
	mustEmbedUnimplementedArtifactsServiceServer()
}

// UnimplementedArtifactsServiceServer must be embedded to have forward compatible implementations.
type UnimplementedArtifactsServiceServer struct {
}

func (UnimplementedArtifactsServiceServer) BuildSetup(context.Context, *BuildSetupRequest) (*BuildSetupResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildSetup not implemented")
}
func (UnimplementedArtifactsServiceServer) Get(context.Context, *GetRequest) (*GetResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Get not implemented")
}
func (UnimplementedArtifactsServiceServer) FetchPinnedGuestImageUris(context.Context, *PinnedGuestImageUriRequest) (*PinnedGuestImageUriResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FetchPinnedGuestImageUris not implemented")
}
func (UnimplementedArtifactsServiceServer) FetchMetadata(context.Context, *FetchMetadataRequest) (*FetchMetadataResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FetchMetadata not implemented")
}
func (UnimplementedArtifactsServiceServer) FetchCentralizedSuites(context.Context, *FetchCentralizedSuitesRequest) (*FetchCentralizedSuitesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FetchCentralizedSuites not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleAutotestFiles(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleAutotestFiles not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleChromeOSConfig(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleChromeOSConfig not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleDebugSymbols(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleDebugSymbols not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleEbuildLogs(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleEbuildLogs not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleFirmware(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFirmware not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleImageArchives(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleImageArchives not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleImageZip(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleImageZip not implemented")
}
func (UnimplementedArtifactsServiceServer) BundlePinnedGuestImages(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundlePinnedGuestImages not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleSimpleChromeArtifacts(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleSimpleChromeArtifacts not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleTastFiles(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleTastFiles not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleTestUpdatePayloads(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleTestUpdatePayloads not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleVmFiles(context.Context, *BundleVmFilesRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleVmFiles not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleFpmcuUnittests(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFpmcuUnittests not implemented")
}
func (UnimplementedArtifactsServiceServer) BundleGceTarball(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleGceTarball not implemented")
}
func (UnimplementedArtifactsServiceServer) mustEmbedUnimplementedArtifactsServiceServer() {}

// UnsafeArtifactsServiceServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to ArtifactsServiceServer will
// result in compilation errors.
type UnsafeArtifactsServiceServer interface {
	mustEmbedUnimplementedArtifactsServiceServer()
}

func RegisterArtifactsServiceServer(s grpc.ServiceRegistrar, srv ArtifactsServiceServer) {
	s.RegisterService(&ArtifactsService_ServiceDesc, srv)
}

func _ArtifactsService_BuildSetup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildSetupRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BuildSetup(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BuildSetup",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BuildSetup(ctx, req.(*BuildSetupRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(GetRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).Get(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/Get",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).Get(ctx, req.(*GetRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_FetchPinnedGuestImageUris_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(PinnedGuestImageUriRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).FetchPinnedGuestImageUris(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/FetchPinnedGuestImageUris",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).FetchPinnedGuestImageUris(ctx, req.(*PinnedGuestImageUriRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_FetchMetadata_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(FetchMetadataRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).FetchMetadata(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/FetchMetadata",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).FetchMetadata(ctx, req.(*FetchMetadataRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_FetchCentralizedSuites_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(FetchCentralizedSuitesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).FetchCentralizedSuites(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/FetchCentralizedSuites",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).FetchCentralizedSuites(ctx, req.(*FetchCentralizedSuitesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleAutotestFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleAutotestFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleAutotestFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleAutotestFiles(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleChromeOSConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleChromeOSConfig(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleChromeOSConfig",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleChromeOSConfig(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleDebugSymbols_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleDebugSymbols(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleDebugSymbols",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleDebugSymbols(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleEbuildLogs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleEbuildLogs(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleEbuildLogs",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleEbuildLogs(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleFirmware(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleImageArchives_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleImageArchives(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleImageArchives",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleImageArchives(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleImageZip_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleImageZip(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleImageZip",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleImageZip(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundlePinnedGuestImages_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundlePinnedGuestImages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundlePinnedGuestImages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundlePinnedGuestImages(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleSimpleChromeArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleSimpleChromeArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleSimpleChromeArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleSimpleChromeArtifacts(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleTastFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleTastFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleTastFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleTastFiles(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleTestUpdatePayloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleTestUpdatePayloads(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleTestUpdatePayloads",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleTestUpdatePayloads(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleVmFiles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleVmFilesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleVmFiles(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleVmFiles",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleVmFiles(ctx, req.(*BundleVmFilesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleFpmcuUnittests_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleFpmcuUnittests(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleFpmcuUnittests",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleFpmcuUnittests(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_BundleGceTarball_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleGceTarball(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleGceTarball",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleGceTarball(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

// ArtifactsService_ServiceDesc is the grpc.ServiceDesc for ArtifactsService service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var ArtifactsService_ServiceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.ArtifactsService",
	HandlerType: (*ArtifactsServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildSetup",
			Handler:    _ArtifactsService_BuildSetup_Handler,
		},
		{
			MethodName: "Get",
			Handler:    _ArtifactsService_Get_Handler,
		},
		{
			MethodName: "FetchPinnedGuestImageUris",
			Handler:    _ArtifactsService_FetchPinnedGuestImageUris_Handler,
		},
		{
			MethodName: "FetchMetadata",
			Handler:    _ArtifactsService_FetchMetadata_Handler,
		},
		{
			MethodName: "FetchCentralizedSuites",
			Handler:    _ArtifactsService_FetchCentralizedSuites_Handler,
		},
		{
			MethodName: "BundleAutotestFiles",
			Handler:    _ArtifactsService_BundleAutotestFiles_Handler,
		},
		{
			MethodName: "BundleChromeOSConfig",
			Handler:    _ArtifactsService_BundleChromeOSConfig_Handler,
		},
		{
			MethodName: "BundleDebugSymbols",
			Handler:    _ArtifactsService_BundleDebugSymbols_Handler,
		},
		{
			MethodName: "BundleEbuildLogs",
			Handler:    _ArtifactsService_BundleEbuildLogs_Handler,
		},
		{
			MethodName: "BundleFirmware",
			Handler:    _ArtifactsService_BundleFirmware_Handler,
		},
		{
			MethodName: "BundleImageArchives",
			Handler:    _ArtifactsService_BundleImageArchives_Handler,
		},
		{
			MethodName: "BundleImageZip",
			Handler:    _ArtifactsService_BundleImageZip_Handler,
		},
		{
			MethodName: "BundlePinnedGuestImages",
			Handler:    _ArtifactsService_BundlePinnedGuestImages_Handler,
		},
		{
			MethodName: "BundleSimpleChromeArtifacts",
			Handler:    _ArtifactsService_BundleSimpleChromeArtifacts_Handler,
		},
		{
			MethodName: "BundleTastFiles",
			Handler:    _ArtifactsService_BundleTastFiles_Handler,
		},
		{
			MethodName: "BundleTestUpdatePayloads",
			Handler:    _ArtifactsService_BundleTestUpdatePayloads_Handler,
		},
		{
			MethodName: "BundleVmFiles",
			Handler:    _ArtifactsService_BundleVmFiles_Handler,
		},
		{
			MethodName: "BundleFpmcuUnittests",
			Handler:    _ArtifactsService_BundleFpmcuUnittests_Handler,
		},
		{
			MethodName: "BundleGceTarball",
			Handler:    _ArtifactsService_BundleGceTarball_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/artifacts.proto",
}
