// Code generated by protoc-gen-go-grpc. DO NOT EDIT.

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)
	// TODO(crbug/1034529): 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(crbug/1034529): DEPRECATED use Get
	// Create the ChromeOS Config JSON payload.  Added in R78.
	BundleChromeOSConfig(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): 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(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): 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(crbug/1034529): DEPRECATED use Get
	// Generate zip containing all built images for the target.
	BundleImageZip(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// DEPRECATED for recipes: crbug/1019868: This are being replaced by
	// ToolchainService.Bundle{ArtifactType}()
	// Create Chrome Benchmark AFDO builder artifacts.  Added in R78.
	BundleAFDOGenerationArtifacts(ctx context.Context, in *BundleChromeAFDORequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): 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(crbug/1034529): DEPRECATED use Get
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): 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(crbug/1034529): 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(crbug/1034529): 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(crbug/1034529): DEPRECATED use Get
	// Generate a CPE report to a file.  Added in R78.
	ExportCpeReport(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// TODO(crbug/1034529): 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(crbug/1034529): 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)
	// Generate all Remote Test Driver metadata.  Added in R85.
	//
	// Response consists of one or more metadata files. Each file must contain a
	// single binary encoded chromiumos.config.api.test.metadata.v1.Specification
	// protobuf payload.
	// Schema defined at
	// https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverImages()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverSpecification(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error)
	// Generate all Remote Test Driver container images.  Added in R85.
	//
	// Response consists of one or more Docker container images.
	// The images are identified by their Docker image digest. The filenames of
	// the created artifacts are ignored.
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverSpecification()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverImages(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) 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) BundleAFDOGenerationArtifacts(ctx context.Context, in *BundleChromeAFDORequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/BundleAFDOGenerationArtifacts", 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) ExportCpeReport(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/ExportCpeReport", 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
}

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

func (c *artifactsServiceClient) GenerateRemoteTestDriverImages(ctx context.Context, in *BundleRequest, opts ...grpc.CallOption) (*BundleResponse, error) {
	out := new(BundleResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.ArtifactsService/GenerateRemoteTestDriverImages", 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)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all files needed for Autotest HW testing.
	BundleAutotestFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create the ChromeOS Config JSON payload.  Added in R78.
	BundleChromeOSConfig(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive of debug symbols.  Added in R90.
	BundleDebugSymbols(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with ebuild logs.
	BundleEbuildLogs(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with unsigned firmware images.
	BundleFirmware(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): 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(crbug/1034529): DEPRECATED use Get
	// Generate zip containing all built images for the target.
	BundleImageZip(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// DEPRECATED for recipes: crbug/1019868: This are being replaced by
	// ToolchainService.Bundle{ArtifactType}()
	// Create Chrome Benchmark AFDO builder artifacts.  Added in R78.
	BundleAFDOGenerationArtifacts(context.Context, *BundleChromeAFDORequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all guest images test bundles.
	BundlePinnedGuestImages(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create the simple chrome artifacts.
	BundleSimpleChromeArtifacts(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with all files needed for Tast HW testing.
	BundleTastFiles(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate minimal update payloads to be used in HW testing.
	BundleTestUpdatePayloads(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with VM memory and disk images.
	BundleVmFiles(context.Context, *BundleVmFilesRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Generate a CPE report to a file.  Added in R78.
	ExportCpeReport(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tar archive with fingerprint MCU on-device unittest binaries.
	// Added in R88.
	BundleFpmcuUnittests(context.Context, *BundleRequest) (*BundleResponse, error)
	// TODO(crbug/1034529): DEPRECATED use Get
	// Create a tarball from the test image suitable for importing into GCE.
	// Added in R89.
	BundleGceTarball(context.Context, *BundleRequest) (*BundleResponse, error)
	// Generate all Remote Test Driver metadata.  Added in R85.
	//
	// Response consists of one or more metadata files. Each file must contain a
	// single binary encoded chromiumos.config.api.test.metadata.v1.Specification
	// protobuf payload.
	// Schema defined at
	// https://chromium.googlesource.com/chromiumos/config/+/refs/heads/master/proto/chromiumos/config/api/test/metadata/v1/metadata.proto
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverImages()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverSpecification(context.Context, *BundleRequest) (*BundleResponse, error)
	// Generate all Remote Test Driver container images.  Added in R85.
	//
	// Response consists of one or more Docker container images.
	// The images are identified by their Docker image digest. The filenames of
	// the created artifacts are ignored.
	//
	// These artifacts partially replace chromiumos.ArtifactsByService.Test
	// artifacts. See also, GenerateRemoteTestDriverSpecification()
	//
	// TODO(crbug/1034529): DEPRECATED use Get
	GenerateRemoteTestDriverImages(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) 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) BundleAFDOGenerationArtifacts(context.Context, *BundleChromeAFDORequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleAFDOGenerationArtifacts 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) ExportCpeReport(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ExportCpeReport 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) GenerateRemoteTestDriverSpecification(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateRemoteTestDriverSpecification not implemented")
}
func (UnimplementedArtifactsServiceServer) GenerateRemoteTestDriverImages(context.Context, *BundleRequest) (*BundleResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GenerateRemoteTestDriverImages 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_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_BundleAFDOGenerationArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleChromeAFDORequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(ArtifactsServiceServer).BundleAFDOGenerationArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/BundleAFDOGenerationArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).BundleAFDOGenerationArtifacts(ctx, req.(*BundleChromeAFDORequest))
	}
	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_ExportCpeReport_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).ExportCpeReport(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/ExportCpeReport",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).ExportCpeReport(ctx, req.(*BundleRequest))
	}
	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)
}

func _ArtifactsService_GenerateRemoteTestDriverSpecification_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).GenerateRemoteTestDriverSpecification(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/GenerateRemoteTestDriverSpecification",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverSpecification(ctx, req.(*BundleRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _ArtifactsService_GenerateRemoteTestDriverImages_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).GenerateRemoteTestDriverImages(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.ArtifactsService/GenerateRemoteTestDriverImages",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(ArtifactsServiceServer).GenerateRemoteTestDriverImages(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: "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: "BundleAFDOGenerationArtifacts",
			Handler:    _ArtifactsService_BundleAFDOGenerationArtifacts_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: "ExportCpeReport",
			Handler:    _ArtifactsService_ExportCpeReport_Handler,
		},
		{
			MethodName: "BundleFpmcuUnittests",
			Handler:    _ArtifactsService_BundleFpmcuUnittests_Handler,
		},
		{
			MethodName: "BundleGceTarball",
			Handler:    _ArtifactsService_BundleGceTarball_Handler,
		},
		{
			MethodName: "GenerateRemoteTestDriverSpecification",
			Handler:    _ArtifactsService_GenerateRemoteTestDriverSpecification_Handler,
		},
		{
			MethodName: "GenerateRemoteTestDriverImages",
			Handler:    _ArtifactsService_GenerateRemoteTestDriverImages_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/artifacts.proto",
}
