// Path: bucket4j-spring-boot-starter-context/src/main/java/com/giffing/bucket4j/spring/boot/starter/context/RateLimitCheck.java
// @FunctionalInterface
// public interface RateLimitCheck<R> {
// 
// 	/**
// 	 * @param request the request information object
// 	 * 
// 	 * @return null if no rate limit should be performed. (maybe skipped or shouldn't be executed).
// 	 */
// 	ConsumptionProbeHolder rateLimit(R request, boolean async);
// 	
// }
// 
// Path: bucket4j-spring-boot-starter-context/src/main/java/com/giffing/bucket4j/spring/boot/starter/context/RateLimitConditionMatchingStrategy.java
// public enum RateLimitConditionMatchingStrategy {
// 
// 	/**
// 	 * All rate limits should be evaluated
// 	 */
// 	ALL,
// 	/**
// 	 * Only the first matching rate limit will be evaluated
// 	 */
// 	FIRST,
// 	
// }


import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.giffing.bucket4j.spring.boot.starter.context.RateLimitCheck;
import com.giffing.bucket4j.spring.boot.starter.context.RateLimitConditionMatchingStrategy;

package com.giffing.bucket4j.spring.boot.starter.context.properties;



/**
 * This class is the main configuration class which is used to build the servlet|webflux|gateway request filter
 *
 */
public class FilterConfiguration<R> {

	private RateLimitConditionMatchingStrategy strategy = RateLimitConditionMatchingStrategy.FIRST;
	
	/**
	 * The url on which the filter should listen.
	 */
	private String url;
	
	/**
	 * The order of the filter depending on other filters independently from the Bucket4j filters.
	 */
	private int order;
	
	/**
	 * Hides the HTTP response headers 
	 * x-rate-limit-remaining
	 * x-rate-limit-retry-after-seconds
	 */
	private Boolean hideHttpResponseHeaders = Boolean.FALSE;
	
	/**
	 * The HTTP response body which should be returned when limiting the rate.
	 */
	private String httpResponseBody;

	private Map<String, String> httpResponseHeaders;


// Path: bucket4j-spring-boot-starter-context/src/main/java/com/giffing/bucket4j/spring/boot/starter/context/RateLimitCheck.java
// @FunctionalInterface
// public interface RateLimitCheck<R> {
// 
// 	/**
// 	 * @param request the request information object
// 	 * 
// 	 * @return null if no rate limit should be performed. (maybe skipped or shouldn't be executed).
// 	 */
// 	ConsumptionProbeHolder rateLimit(R request, boolean async);
// 	
// }
// 
// Path: bucket4j-spring-boot-starter-context/src/main/java/com/giffing/bucket4j/spring/boot/starter/context/RateLimitConditionMatchingStrategy.java
// public enum RateLimitConditionMatchingStrategy {
// 
// 	/**
// 	 * All rate limits should be evaluated
// 	 */
// 	ALL,
// 	/**
// 	 * Only the first matching rate limit will be evaluated
// 	 */
// 	FIRST,
// 	
// }


// Path: bucket4j-spring-boot-starter-context/src/main/java/com/giffing/bucket4j/spring/boot/starter/context/properties/FilterConfiguration.java
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.giffing.bucket4j.spring.boot.starter.context.RateLimitCheck;
import com.giffing.bucket4j.spring.boot.starter.context.RateLimitConditionMatchingStrategy;

package com.giffing.bucket4j.spring.boot.starter.context.properties;



/**
 * This class is the main configuration class which is used to build the servlet|webflux|gateway request filter
 *
 */
public class FilterConfiguration<R> {

	private RateLimitConditionMatchingStrategy strategy = RateLimitConditionMatchingStrategy.FIRST;
	
	/**
	 * The url on which the filter should listen.
	 */
	private String url;
	
	/**
	 * The order of the filter depending on other filters independently from the Bucket4j filters.
	 */
	private int order;
	
	/**
	 * Hides the HTTP response headers 
	 * x-rate-limit-remaining
	 * x-rate-limit-retry-after-seconds
	 */
	private Boolean hideHttpResponseHeaders = Boolean.FALSE;
	
	/**
	 * The HTTP response body which should be returned when limiting the rate.
	 */
	private String httpResponseBody;

	private Map<String, String> httpResponseHeaders;


	private List<RateLimitCheck<R>> rateLimitChecks = new ArrayList<>();
