// Path: src/main/java/com/webfluxclient/LogLevel.java
// public enum LogLevel {
//     /** No logs. */
//     NONE,
// 
//     /**
//      * Logs request and response lines.
//      *
//      * <p>Example:
//      * <pre>{@code
//      * --> POST /hello
//      * Content-Type: application/json
//      *
//      * <-- 200 OK POST /hello (22ms)
//      * }</pre>
//      */
//     BASIC,
// 
//     /**
//      * Logs request and response lines and their respective headers.
//      *
//      * <p>Example:
//      * <pre>{@code
//      * --> POST /hello
//      * Content-Type: plain/text
//      * Headers:
//      * - Accept-Language: en
//      * - Accept-Charset: UTF-8
//      * --> END POST
//      *
//      * <-- 200 OK POST /hello (22ms)
//      * Headers:
//      * - Content-Type: plain/text
//      * <-- END HTTP
//      * }</pre>
//      */
//     HEADERS
// }
// 
// Path: src/main/java/com/webfluxclient/Logger.java
// public interface Logger {
//     void log(Supplier<String> messageSupplier);
//     void log(String message);
// }
// 
// Path: src/main/java/com/webfluxclient/RequestProcessor.java
// @FunctionalInterface
// public interface RequestProcessor {
// 
//     ClientRequest process(ClientRequest request);
// 
//     default RequestProcessor andThen(RequestProcessor after) {
//         Assert.notNull(after, "");
//         return request -> after.process(process(request));
//     }
// }
// 
// Path: src/main/java/com/webfluxclient/ResponseProcessor.java
// @FunctionalInterface
// public interface ResponseProcessor {
// 
//     ClientResponse process(ClientResponse clientResponse);
// 
//     default ResponseProcessor andThen(ResponseProcessor after) {
//         Assert.notNull(after, "");
//         return request -> after.process(process(request));
//     }
// }
// 
// Path: src/main/java/com/webfluxclient/codec/ExtendedClientCodecConfigurer.java
// public interface ExtendedClientCodecConfigurer extends ClientCodecConfigurer {
// 
//     List<HttpErrorReader> getErrorReaders();
// 
//     ExtendedCustomCodecs customCodecs();
// 
//     ExtendedClientDefaultCodecs defaultCodecs();
// 
//     static ExtendedClientCodecConfigurer create(){
//         return new DefaultExtendedClientCodecConfigurer();
//     }
// 
//     interface ExtendedClientDefaultCodecs extends ClientDefaultCodecs {
//         void httpClientErrorDecoder(HttpClientErrorDecoder clientErrorDecoder);
//         void httpServerErrorDecoder(HttpServerErrorDecoder serverErrorDecoder);
//     }
// 
//     interface ExtendedCustomCodecs extends CustomCodecs{
//         void errorReader(HttpErrorReader errorReader);
//         void errorDecoder(ErrorDecoder errorDecoder);
//     }
// }


import com.webfluxclient.LogLevel;
import com.webfluxclient.Logger;
import com.webfluxclient.RequestProcessor;
import com.webfluxclient.ResponseProcessor;
import com.webfluxclient.codec.ExtendedClientCodecConfigurer;
import java.lang.reflect.InvocationHandler;
import java.net.URI;
import java.util.List;
package com.webfluxclient.handler;



public interface ReactiveInvocationHandlerFactory {
    InvocationHandler build(
// Path: src/main/java/com/webfluxclient/LogLevel.java
// public enum LogLevel {
//     /** No logs. */
//     NONE,
// 
//     /**
//      * Logs request and response lines.
//      *
//      * <p>Example:
//      * <pre>{@code
//      * --> POST /hello
//      * Content-Type: application/json
//      *
//      * <-- 200 OK POST /hello (22ms)
//      * }</pre>
//      */
//     BASIC,
// 
//     /**
//      * Logs request and response lines and their respective headers.
//      *
//      * <p>Example:
//      * <pre>{@code
//      * --> POST /hello
//      * Content-Type: plain/text
//      * Headers:
//      * - Accept-Language: en
//      * - Accept-Charset: UTF-8
//      * --> END POST
//      *
//      * <-- 200 OK POST /hello (22ms)
//      * Headers:
//      * - Content-Type: plain/text
//      * <-- END HTTP
//      * }</pre>
//      */
//     HEADERS
// }
// 
// Path: src/main/java/com/webfluxclient/Logger.java
// public interface Logger {
//     void log(Supplier<String> messageSupplier);
//     void log(String message);
// }
// 
// Path: src/main/java/com/webfluxclient/RequestProcessor.java
// @FunctionalInterface
// public interface RequestProcessor {
// 
//     ClientRequest process(ClientRequest request);
// 
//     default RequestProcessor andThen(RequestProcessor after) {
//         Assert.notNull(after, "");
//         return request -> after.process(process(request));
//     }
// }
// 
// Path: src/main/java/com/webfluxclient/ResponseProcessor.java
// @FunctionalInterface
// public interface ResponseProcessor {
// 
//     ClientResponse process(ClientResponse clientResponse);
// 
//     default ResponseProcessor andThen(ResponseProcessor after) {
//         Assert.notNull(after, "");
//         return request -> after.process(process(request));
//     }
// }
// 
// Path: src/main/java/com/webfluxclient/codec/ExtendedClientCodecConfigurer.java
// public interface ExtendedClientCodecConfigurer extends ClientCodecConfigurer {
// 
//     List<HttpErrorReader> getErrorReaders();
// 
//     ExtendedCustomCodecs customCodecs();
// 
//     ExtendedClientDefaultCodecs defaultCodecs();
// 
//     static ExtendedClientCodecConfigurer create(){
//         return new DefaultExtendedClientCodecConfigurer();
//     }
// 
//     interface ExtendedClientDefaultCodecs extends ClientDefaultCodecs {
//         void httpClientErrorDecoder(HttpClientErrorDecoder clientErrorDecoder);
//         void httpServerErrorDecoder(HttpServerErrorDecoder serverErrorDecoder);
//     }
// 
//     interface ExtendedCustomCodecs extends CustomCodecs{
//         void errorReader(HttpErrorReader errorReader);
//         void errorDecoder(ErrorDecoder errorDecoder);
//     }
// }


// Path: src/main/java/com/webfluxclient/handler/ReactiveInvocationHandlerFactory.java
import com.webfluxclient.LogLevel;
import com.webfluxclient.Logger;
import com.webfluxclient.RequestProcessor;
import com.webfluxclient.ResponseProcessor;
import com.webfluxclient.codec.ExtendedClientCodecConfigurer;
import java.lang.reflect.InvocationHandler;
import java.net.URI;
import java.util.List;

package com.webfluxclient.handler;



public interface ReactiveInvocationHandlerFactory {
    InvocationHandler build(
            ExtendedClientCodecConfigurer codecConfigurer,