All Downloads are FREE. Search and download functionalities are using the official Maven repository.

tech.ydb.core.grpc.UnaryStreamToFuture Maven / Gradle / Ivy

package tech.ydb.core.grpc;

import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;

import javax.annotation.Nullable;

import io.grpc.ClientCall;
import io.grpc.Metadata;

import tech.ydb.core.Issue;
import tech.ydb.core.Result;
import tech.ydb.core.Status;
import tech.ydb.core.StatusCode;


/**
 * @author Sergey Polovko
 * @param  type of value
 */
public class UnaryStreamToFuture extends ClientCall.Listener {
    private static final Status NO_VALUE = Status.of(
            StatusCode.CLIENT_INTERNAL_ERROR, null,
            Issue.of("No value received for gRPC unary call", Issue.Severity.ERROR)
    );

    private static final Status MULTIPLY_VALUES = Status.of(
            StatusCode.CLIENT_INTERNAL_ERROR, null,
            Issue.of("More than one value received for gRPC unary call", Issue.Severity.ERROR)
    );

    private final CompletableFuture> responseFuture;
    private final Consumer trailersHandler;
    private final Consumer statusHandler;
    private T value;

    public UnaryStreamToFuture(CompletableFuture> responseFuture,
            Consumer trailersHandler,
            Consumer statusHandler) {
        this.responseFuture = responseFuture;
        this.trailersHandler = trailersHandler;
        this.statusHandler = statusHandler;
    }

    @Override
    public void onMessage(T value) {
        if (this.value != null) {
            responseFuture.complete(Result.fail(MULTIPLY_VALUES));
        }
        this.value = value;
    }

    @Override
    public void onClose(io.grpc.Status status, @Nullable Metadata trailers) {
        if (trailersHandler != null && trailers != null) {
            trailersHandler.accept(trailers);
        }
        if (statusHandler != null) {
            statusHandler.accept(status);
        }

        if (status.isOk()) {
            if (value == null) {
                responseFuture.complete(Result.fail(NO_VALUE));
            } else {
                responseFuture.complete(Result.success(value));
            }
        } else {
            responseFuture.complete(GrpcStatuses.toResult(status));
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy