// Path: src/main/java/com/webfluxclient/metadata/annotation/AnnotatedParameterProcessor.java
// public interface AnnotatedParameterProcessor {
// 
//     Class<? extends Annotation> getAnnotationType();
// 
//     void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType);
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/PathVariableParameterProcessor.java
// public class PathVariableParameterProcessor implements AnnotatedParameterProcessor {
// 
//     @Override
//     public Class<? extends Annotation> getAnnotationType() {
//         return PathVariable.class;
//     }
// 
//     @Override
//     public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType) {
//         String name = PathVariable.class.cast(annotation).value();
//         Assert.isTrue(StringUtils.hasText(name), "");
//         requestTemplateBuilder.addPathIndex(integer, name);
//     }
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/RequestBodyParameterProcessor.java
// public class RequestBodyParameterProcessor implements AnnotatedParameterProcessor {
// 
// 	@Override
// 	public Class<? extends Annotation> getAnnotationType() {
// 		return RequestBody.class;
// 	}
// 
// 	@Override
// 	public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer index, Type parameterType) {
// 		requestTemplateBuilder.body(index, parameterType);
// 	}
// 
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/RequestHeaderParameterProcessor.java
// public class RequestHeaderParameterProcessor implements AnnotatedParameterProcessor {
// 
// 	@Override
// 	public Class<? extends Annotation> getAnnotationType() {
// 		return RequestHeader.class;
// 	}
// 
// 	@Override
// 	public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType) {
// 		RequestHeader requestParam = RequestHeader.class.cast(annotation);
// 		String name = requestParam.value();
// 		Assert.isTrue(StringUtils.hasText(name), "");
// 
// 		requestTemplateBuilder.addHeader(integer, name);
// 	}
// 
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/RequestParamParameterProcessor.java
// public class RequestParamParameterProcessor implements AnnotatedParameterProcessor {
// 
// 	@Override
// 	public Class<? extends Annotation> getAnnotationType() {
// 		return RequestParam.class;
// 	}
// 
// 	@Override
// 	public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType) {
// 		RequestParam requestParam = RequestParam.class.cast(annotation);
// 		String name = requestParam.value();
// 		Assert.isTrue(StringUtils.hasText(name), "");
// 
// 		requestTemplateBuilder.addParameter(integer, name);
// 	}
// 
// }


import com.webfluxclient.metadata.annotation.AnnotatedParameterProcessor;
import com.webfluxclient.metadata.annotation.PathVariableParameterProcessor;
import com.webfluxclient.metadata.annotation.RequestBodyParameterProcessor;
import com.webfluxclient.metadata.annotation.RequestHeaderParameterProcessor;
import com.webfluxclient.metadata.annotation.RequestParamParameterProcessor;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.StandardAnnotationMetadata;
import org.springframework.core.type.StandardMethodMetadata;
import org.springframework.http.HttpMethod;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
package com.webfluxclient.metadata;



public class MethodMetadataFactory {

    private Map<Class<? extends Annotation>, AnnotatedParameterProcessor> annotatedArgumentProcessors;

    public MethodMetadataFactory() {
        this.annotatedArgumentProcessors = Stream.of(
// Path: src/main/java/com/webfluxclient/metadata/annotation/AnnotatedParameterProcessor.java
// public interface AnnotatedParameterProcessor {
// 
//     Class<? extends Annotation> getAnnotationType();
// 
//     void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType);
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/PathVariableParameterProcessor.java
// public class PathVariableParameterProcessor implements AnnotatedParameterProcessor {
// 
//     @Override
//     public Class<? extends Annotation> getAnnotationType() {
//         return PathVariable.class;
//     }
// 
//     @Override
//     public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType) {
//         String name = PathVariable.class.cast(annotation).value();
//         Assert.isTrue(StringUtils.hasText(name), "");
//         requestTemplateBuilder.addPathIndex(integer, name);
//     }
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/RequestBodyParameterProcessor.java
// public class RequestBodyParameterProcessor implements AnnotatedParameterProcessor {
// 
// 	@Override
// 	public Class<? extends Annotation> getAnnotationType() {
// 		return RequestBody.class;
// 	}
// 
// 	@Override
// 	public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer index, Type parameterType) {
// 		requestTemplateBuilder.body(index, parameterType);
// 	}
// 
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/RequestHeaderParameterProcessor.java
// public class RequestHeaderParameterProcessor implements AnnotatedParameterProcessor {
// 
// 	@Override
// 	public Class<? extends Annotation> getAnnotationType() {
// 		return RequestHeader.class;
// 	}
// 
// 	@Override
// 	public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType) {
// 		RequestHeader requestParam = RequestHeader.class.cast(annotation);
// 		String name = requestParam.value();
// 		Assert.isTrue(StringUtils.hasText(name), "");
// 
// 		requestTemplateBuilder.addHeader(integer, name);
// 	}
// 
// }
// 
// Path: src/main/java/com/webfluxclient/metadata/annotation/RequestParamParameterProcessor.java
// public class RequestParamParameterProcessor implements AnnotatedParameterProcessor {
// 
// 	@Override
// 	public Class<? extends Annotation> getAnnotationType() {
// 		return RequestParam.class;
// 	}
// 
// 	@Override
// 	public void processAnnotation(MethodMetadata.Builder requestTemplateBuilder, Annotation annotation, Integer integer, Type parameterType) {
// 		RequestParam requestParam = RequestParam.class.cast(annotation);
// 		String name = requestParam.value();
// 		Assert.isTrue(StringUtils.hasText(name), "");
// 
// 		requestTemplateBuilder.addParameter(integer, name);
// 	}
// 
// }


// Path: src/main/java/com/webfluxclient/metadata/MethodMetadataFactory.java
import com.webfluxclient.metadata.annotation.AnnotatedParameterProcessor;
import com.webfluxclient.metadata.annotation.PathVariableParameterProcessor;
import com.webfluxclient.metadata.annotation.RequestBodyParameterProcessor;
import com.webfluxclient.metadata.annotation.RequestHeaderParameterProcessor;
import com.webfluxclient.metadata.annotation.RequestParamParameterProcessor;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.StandardAnnotationMetadata;
import org.springframework.core.type.StandardMethodMetadata;
import org.springframework.http.HttpMethod;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

package com.webfluxclient.metadata;



public class MethodMetadataFactory {

    private Map<Class<? extends Annotation>, AnnotatedParameterProcessor> annotatedArgumentProcessors;

    public MethodMetadataFactory() {
        this.annotatedArgumentProcessors = Stream.of(
                new PathVariableParameterProcessor(),