package it.tdlight.utils; import io.vertx.core.Promise; import org.jetbrains.annotations.NotNull; import reactor.core.publisher.SynchronousSink; import reactor.util.context.Context; public abstract class PromiseSink implements SynchronousSink { private final Promise promise; private PromiseSink(Promise promise) { this.promise = promise; } public static PromiseSink of(Context context, Promise promise) { return new PromiseSinkImpl<>(promise, context); } @Override public void complete() { promise.complete(); } @Override public void error(@NotNull Throwable error) { promise.fail(error); } @Override public void next(@NotNull T value) { promise.complete(value); } private static class PromiseSinkImpl extends PromiseSink { private final Context context; public PromiseSinkImpl(Promise promise, Context context) { super(promise); this.context = context; } @Override public @NotNull Context currentContext() { return context; } } }