// 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/DefaultReactiveInvocationHandlerFactory.java
// public class DefaultReactiveInvocationHandlerFactory implements ReactiveInvocationHandlerFactory {
// 
//     private MethodMetadataFactory methodMetadataFactory;
//     private RequestExecutorFactory requestExecutorFactory;
//     private ExchangeFilterFunctionFactory exchangeFilterFunctionFactory;
// 
//     public DefaultReactiveInvocationHandlerFactory() {
//         this.methodMetadataFactory = new MethodMetadataFactory();
//         this.requestExecutorFactory = new DefaultRequestExecutorFactory();
//         this.exchangeFilterFunctionFactory = new DefaultExchangeFilterFunctionFactory();
//     }
// 
//     @Override
//     public InvocationHandler build(ExtendedClientCodecConfigurer codecConfigurer, List<RequestProcessor> requestProcessors, List<ResponseProcessor> responseProcessors, Logger logger, LogLevel logLevel, Class<?> target, URI uri) {
//         ExchangeFilterFunction exchangeFilterFunction = exchangeFilterFunctionFactory.build(requestProcessors, responseProcessors, logger, logLevel);
//         RequestExecutor requestExecutor = requestExecutorFactory.build(codecConfigurer, exchangeFilterFunction);
//         ResponseBodyProcessor responseBodyProcessor = new DefaultResponseBodyProcessor(codecConfigurer.getErrorReaders());
// 
//         Map<Method, ClientMethodHandler> invocationDispatcher = methodMetadataFactory.build(target, uri)
//                 .stream()
//                 .collect(toMap(MethodMetadata::getTargetMethod, methodMetadata -> new DefaultClientMethodHandler(methodMetadata, requestExecutor, responseBodyProcessor)));
// 
//         return new DefaultReactiveInvocationHandler(invocationDispatcher);
//     }
// }


import com.webfluxclient.codec.ExtendedClientCodecConfigurer;
import com.webfluxclient.handler.DefaultReactiveInvocationHandlerFactory;
import java.net.URI;
import java.util.List;
import java.util.function.Consumer;
package com.webfluxclient;



/**
 *  A mutable builder to configure a Proxy
 *
 * @author Jérémy Brixhe
 * */
public interface ClientBuilder {

    ClientBuilder registerDefaultCodecs(boolean registerDefaults);

// 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/DefaultReactiveInvocationHandlerFactory.java
// public class DefaultReactiveInvocationHandlerFactory implements ReactiveInvocationHandlerFactory {
// 
//     private MethodMetadataFactory methodMetadataFactory;
//     private RequestExecutorFactory requestExecutorFactory;
//     private ExchangeFilterFunctionFactory exchangeFilterFunctionFactory;
// 
//     public DefaultReactiveInvocationHandlerFactory() {
//         this.methodMetadataFactory = new MethodMetadataFactory();
//         this.requestExecutorFactory = new DefaultRequestExecutorFactory();
//         this.exchangeFilterFunctionFactory = new DefaultExchangeFilterFunctionFactory();
//     }
// 
//     @Override
//     public InvocationHandler build(ExtendedClientCodecConfigurer codecConfigurer, List<RequestProcessor> requestProcessors, List<ResponseProcessor> responseProcessors, Logger logger, LogLevel logLevel, Class<?> target, URI uri) {
//         ExchangeFilterFunction exchangeFilterFunction = exchangeFilterFunctionFactory.build(requestProcessors, responseProcessors, logger, logLevel);
//         RequestExecutor requestExecutor = requestExecutorFactory.build(codecConfigurer, exchangeFilterFunction);
//         ResponseBodyProcessor responseBodyProcessor = new DefaultResponseBodyProcessor(codecConfigurer.getErrorReaders());
// 
//         Map<Method, ClientMethodHandler> invocationDispatcher = methodMetadataFactory.build(target, uri)
//                 .stream()
//                 .collect(toMap(MethodMetadata::getTargetMethod, methodMetadata -> new DefaultClientMethodHandler(methodMetadata, requestExecutor, responseBodyProcessor)));
// 
//         return new DefaultReactiveInvocationHandler(invocationDispatcher);
//     }
// }


// Path: src/main/java/com/webfluxclient/ClientBuilder.java
import com.webfluxclient.codec.ExtendedClientCodecConfigurer;
import com.webfluxclient.handler.DefaultReactiveInvocationHandlerFactory;
import java.net.URI;
import java.util.List;
import java.util.function.Consumer;

package com.webfluxclient;



/**
 *  A mutable builder to configure a Proxy
 *
 * @author Jérémy Brixhe
 * */
public interface ClientBuilder {

    ClientBuilder registerDefaultCodecs(boolean registerDefaults);

    ClientBuilder defaultCodecs(Consumer<ExtendedClientCodecConfigurer.ExtendedClientDefaultCodecs> defaultCodecsConfigurerConsumer);