// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package io.v.v23.rpc;

import io.v.v23.verror.VException;

import java.lang.reflect.Type;

/**
 * The interface for each in-flight call on the {@link Client}.  Method {@link #finish finish}
 * must be called to finish the call; all other methods are optional.
 */
public interface ClientCall extends Stream {
    /**
     * Indicates to the server that no more items will be sent; server's
     * {@link StreamServerCall#recv recv} calls will throw {@link java.io.EOFException} after
     * all sent items.  Subsequent calls to {@link Stream#send send} will fail.
     * <p>
     * This is an optional call - it's used by streaming clients that need the server to throw
     * {@link java.io.EOFException}.
     *
     * @throws VException      if there was an error closing
     */
    void closeSend() throws VException;

    /**
     * Blocks until the server has finished the call and returns the positional output arguments
     * (of any arity).
     *
     * @param  types           types for all the output arguments
     * @return                 an array of output arguments
     * @throws VException      if there was an error executing the call
     */
    Object[] finish(Type[] types) throws VException;

    /**
     * Finishes the RPC call in the background and calls the given callback (must be non-null).
     *
     * @param  types           types for all the output arguments
     * @param  callback        the callback to call when the {@code ClientCall} is finished
     */
    void finish(Type[] types, Callback<Object[]> callback);
}
