/*
 *
 * Copyright 2014 gRPC authors.
 *
 * Licensed 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.
 *
 */

package grpc

import (
	
)

// Invoke sends the RPC request on the wire and returns after response is
// received.  This is typically called by generated code.
//
// All errors returned by Invoke are compatible with the status package.
func ( *ClientConn) ( context.Context,  string, ,  interface{},  ...CallOption) error {
	// allow interceptor to see all applicable call options, which means those
	// configured as defaults from dial option as well as per-call options
	 = combine(.dopts.callOptions, )

	if .dopts.unaryInt != nil {
		return .dopts.unaryInt(, , , , , invoke, ...)
	}
	return invoke(, , , , , ...)
}

func ( []CallOption,  []CallOption) []CallOption {
	// we don't use append because o1 could have extra capacity whose
	// elements would be overwritten, which could cause inadvertent
	// sharing (and race conditions) between concurrent calls
	if len() == 0 {
		return 
	} else if len() == 0 {
		return 
	}
	 := make([]CallOption, len()+len())
	copy(, )
	copy([len():], )
	return 
}

// Invoke sends the RPC request on the wire and returns after response is
// received.  This is typically called by generated code.
//
// DEPRECATED: Use ClientConn.Invoke instead.
func ( context.Context,  string, ,  interface{},  *ClientConn,  ...CallOption) error {
	return .Invoke(, , , , ...)
}

var unaryStreamDesc = &StreamDesc{ServerStreams: false, ClientStreams: false}

func ( context.Context,  string, ,  interface{},  *ClientConn,  ...CallOption) error {
	,  := newClientStream(, unaryStreamDesc, , , ...)
	if  != nil {
		return 
	}
	if  := .SendMsg();  != nil {
		return 
	}
	return .RecvMsg()
}