smallrye-mutiny-vertx-bindings icon indicating copy to clipboard operation
smallrye-mutiny-vertx-bindings copied to clipboard

Support of Future<ReadStream<T>>

Open jponge opened this issue 7 months ago • 2 comments

The generator does not properly support the case of Future<ReadStream<T>> methods (e.g., a Vert.x HTTP client response that is eventually wrapped by a JSON stream parser).

The idea is to translate those to Uni<ReadStream<T>> where the ReadStream is a Mutiny bindings shim, so we can call .toMulti() on it.

Given the following interface:

@VertxGen(concrete = false)
public interface AsyncStreams {

    Future<ReadStream<String>> asyncStream();
}

then the generated code is:

@io.smallrye.mutiny.vertx.MutinyGen(io.vertx.core.streams.AsyncStreams.class)
public interface AsyncStreams {

  static final io.smallrye.mutiny.vertx.TypeArg<io.vertx.mutiny.core.streams.ReadStream<java.lang.String>> TYPE_ARG_0 = new TypeArg<io.vertx.mutiny.core.streams.ReadStream<java.lang.String>>(o1 -> io.vertx.mutiny.core.streams.ReadStream.newInstance((io.vertx.core.streams.ReadStream)o1, TypeArg.unknown()), o1 -> o1.getDelegate());
  io.vertx.core.streams.AsyncStreams getDelegate();

  public io.smallrye.mutiny.Uni<io.vertx.mutiny.core.streams.ReadStream<String>> asyncStream();

  public static  AsyncStreams newInstance(io.vertx.core.streams.AsyncStreams arg) {
    return arg != null ? new AsyncStreamsImpl(arg) : null;
  }

}

class AsyncStreamsImpl implements AsyncStreams {
  private final io.vertx.core.streams.AsyncStreams delegate;
  
  public io.vertx.core.streams.AsyncStreams getDelegate() {
    return delegate;
  }

  /**
   * Empty constructor used by CDI, do not use this constructor directly.
   **/
  AsyncStreamsImpl() {
    this.delegate = null;
  }

  public AsyncStreamsImpl(io.vertx.core.streams.AsyncStreams delegate) {
    this.delegate = delegate;
  }

  @CheckReturnValue
  public io.smallrye.mutiny.Uni<io.vertx.mutiny.core.streams.ReadStream<String>> asyncStream() { 
    return io.smallrye.mutiny.vertx.UniHelper.toUni(delegate.asyncStream().map(x -> ReadStream<String>.newInstance(x)));}

  public io.vertx.mutiny.core.streams.ReadStream<String> asyncStreamAndAwait() { 
    return asyncStream().await().indefinitely();
  }


  public void asyncStreamAndForget() { 
    asyncStream().subscribe().with(io.smallrye.mutiny.vertx.UniHelper.NOOP);
  }


}

where the following method:

@CheckReturnValue
  public io.smallrye.mutiny.Uni<io.vertx.mutiny.core.streams.ReadStream<String>> asyncStream() { 
    return io.smallrye.mutiny.vertx.UniHelper.toUni(delegate.asyncStream().map(x -> ReadStream<String>.newInstance(x)));}

does not compile:

AsyncStreams.java:[46,115] illegal start of type
AsyncStreams.java:[46,116] not a statement
AsyncStreams.java:[46,117] ';' expected
image

jponge avatar Jul 17 '24 09:07 jponge