// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-connect-go. DO NOT EDIT.
//
// Source: registry/v1alpha1/push.proto

package registryv1alpha1connect

import (
	context "context"
	errors "errors"
	http "net/http"
	strings "strings"
)

import (
	connect_go "github.com/bufbuild/connect-go"
)

import (
	v1alpha1 "github.com/apache/dubbo-kubernetes/pkg/bufman/gen/proto/go/registry/v1alpha1"
)

// This is a compile-time assertion to ensure that this generated file and the connect package are
// compatible. If you get a compiler error that this constant is not defined, this code was
// generated with a version of connect newer than the one compiled into your binary. You can fix the
// problem by either regenerating this code with an older version of connect or updating the connect
// version compiled into your binary.
const _ = connect_go.IsAtLeastVersion1_7_0

const (
	// PushServiceName is the fully-qualified name of the PushService service.
	PushServiceName = "bufman.dubbo.apache.org.registry.v1alpha1.PushService"
)

// These constants are the fully-qualified names of the RPCs defined in this package. They're
// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route.
//
// Note that these are different from the fully-qualified method names used by
// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to
// reflection-formatted method names, remove the leading slash and convert the remaining slash to a
// period.
const (
	// PushServicePushProcedure is the fully-qualified name of the PushService's Push RPC.
	PushServicePushProcedure = "/bufman.dubbo.apache.org.registry.v1alpha1.PushService/Push"
	// PushServicePushManifestAndBlobsProcedure is the fully-qualified name of the PushService's
	// PushManifestAndBlobs RPC.
	PushServicePushManifestAndBlobsProcedure = "/bufman.dubbo.apache.org.registry.v1alpha1.PushService/PushManifestAndBlobs"
)

// PushServiceClient is a client for the bufman.dubbo.apache.org.registry.v1alpha1.PushService
// service.
type PushServiceClient interface {
	// Push pushes.
	// NOTE: Newer clients should use PushManifestAndBlobs.
	Push(context.Context, *connect_go.Request[v1alpha1.PushRequest]) (*connect_go.Response[v1alpha1.PushResponse], error)
	// PushManifestAndBlobs pushes a module by encoding it in a manifest and blobs format.
	PushManifestAndBlobs(context.Context, *connect_go.Request[v1alpha1.PushManifestAndBlobsRequest]) (*connect_go.Response[v1alpha1.PushManifestAndBlobsResponse], error)
}

// NewPushServiceClient constructs a client for the
// bufman.dubbo.apache.org.registry.v1alpha1.PushService service. By default, it uses the Connect
// protocol with the binary Protobuf Codec, asks for gzipped responses, and sends uncompressed
// requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or
// connect.WithGRPCWeb() options.
//
// The URL supplied here should be the base URL for the Connect or gRPC server (for example,
// http://api.acme.com or https://acme.com/grpc).
func NewPushServiceClient(httpClient connect_go.HTTPClient, baseURL string, opts ...connect_go.ClientOption) PushServiceClient {
	baseURL = strings.TrimRight(baseURL, "/")
	return &pushServiceClient{
		push: connect_go.NewClient[v1alpha1.PushRequest, v1alpha1.PushResponse](
			httpClient,
			baseURL+PushServicePushProcedure,
			connect_go.WithIdempotency(connect_go.IdempotencyIdempotent),
			connect_go.WithClientOptions(opts...),
		),
		pushManifestAndBlobs: connect_go.NewClient[v1alpha1.PushManifestAndBlobsRequest, v1alpha1.PushManifestAndBlobsResponse](
			httpClient,
			baseURL+PushServicePushManifestAndBlobsProcedure,
			connect_go.WithIdempotency(connect_go.IdempotencyIdempotent),
			connect_go.WithClientOptions(opts...),
		),
	}
}

// pushServiceClient implements PushServiceClient.
type pushServiceClient struct {
	push                 *connect_go.Client[v1alpha1.PushRequest, v1alpha1.PushResponse]
	pushManifestAndBlobs *connect_go.Client[v1alpha1.PushManifestAndBlobsRequest, v1alpha1.PushManifestAndBlobsResponse]
}

// Push calls bufman.dubbo.apache.org.registry.v1alpha1.PushService.Push.
func (c *pushServiceClient) Push(ctx context.Context, req *connect_go.Request[v1alpha1.PushRequest]) (*connect_go.Response[v1alpha1.PushResponse], error) {
	return c.push.CallUnary(ctx, req)
}

// PushManifestAndBlobs calls
// bufman.dubbo.apache.org.registry.v1alpha1.PushService.PushManifestAndBlobs.
func (c *pushServiceClient) PushManifestAndBlobs(ctx context.Context, req *connect_go.Request[v1alpha1.PushManifestAndBlobsRequest]) (*connect_go.Response[v1alpha1.PushManifestAndBlobsResponse], error) {
	return c.pushManifestAndBlobs.CallUnary(ctx, req)
}

// PushServiceHandler is an implementation of the
// bufman.dubbo.apache.org.registry.v1alpha1.PushService service.
type PushServiceHandler interface {
	// Push pushes.
	// NOTE: Newer clients should use PushManifestAndBlobs.
	Push(context.Context, *connect_go.Request[v1alpha1.PushRequest]) (*connect_go.Response[v1alpha1.PushResponse], error)
	// PushManifestAndBlobs pushes a module by encoding it in a manifest and blobs format.
	PushManifestAndBlobs(context.Context, *connect_go.Request[v1alpha1.PushManifestAndBlobsRequest]) (*connect_go.Response[v1alpha1.PushManifestAndBlobsResponse], error)
}

// NewPushServiceHandler builds an HTTP handler from the service implementation. It returns the path
// on which to mount the handler and the handler itself.
//
// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
// and JSON codecs. They also support gzip compression.
func NewPushServiceHandler(svc PushServiceHandler, opts ...connect_go.HandlerOption) (string, http.Handler) {
	pushServicePushHandler := connect_go.NewUnaryHandler(
		PushServicePushProcedure,
		svc.Push,
		connect_go.WithIdempotency(connect_go.IdempotencyIdempotent),
		connect_go.WithHandlerOptions(opts...),
	)
	pushServicePushManifestAndBlobsHandler := connect_go.NewUnaryHandler(
		PushServicePushManifestAndBlobsProcedure,
		svc.PushManifestAndBlobs,
		connect_go.WithIdempotency(connect_go.IdempotencyIdempotent),
		connect_go.WithHandlerOptions(opts...),
	)
	return "/bufman.dubbo.apache.org.registry.v1alpha1.PushService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		switch r.URL.Path {
		case PushServicePushProcedure:
			pushServicePushHandler.ServeHTTP(w, r)
		case PushServicePushManifestAndBlobsProcedure:
			pushServicePushManifestAndBlobsHandler.ServeHTTP(w, r)
		default:
			http.NotFound(w, r)
		}
	})
}

// UnimplementedPushServiceHandler returns CodeUnimplemented from all methods.
type UnimplementedPushServiceHandler struct{}

func (UnimplementedPushServiceHandler) Push(context.Context, *connect_go.Request[v1alpha1.PushRequest]) (*connect_go.Response[v1alpha1.PushResponse], error) {
	return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("bufman.dubbo.apache.org.registry.v1alpha1.PushService.Push is not implemented"))
}

func (UnimplementedPushServiceHandler) PushManifestAndBlobs(context.Context, *connect_go.Request[v1alpha1.PushManifestAndBlobsRequest]) (*connect_go.Response[v1alpha1.PushManifestAndBlobsResponse], error) {
	return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("bufman.dubbo.apache.org.registry.v1alpha1.PushService.PushManifestAndBlobs is not implemented"))
}
