package com.linecorp.armeria.server.http.dynamic; import static java.util.Objects.requireNonNull; import java.util.Map; import java.util.concurrent.CompletionStage; import com.linecorp.armeria.common.http.HttpRequest; import com.linecorp.armeria.common.http.HttpResponse; import com.linecorp.armeria.server.ServiceRequestContext; import com.linecorp.armeria.server.http.AbstractHttpService; /** * {@link DynamicHttpFunction} with args. */ final class MappedDynamicFunction extends AbstractHttpService { /** * {@link DynamicHttpFunction} instance that will be invoked with given args. */ private final DynamicHttpFunction function; /** * Arguments, represented in Map of variable name to its value. */ private final Map<String, String> args; MappedDynamicFunction(DynamicHttpFunction function, Map<String, String> args) { this.function = requireNonNull(function, "function"); this.args = requireNonNull(args, "args"); } @Override public HttpResponse serve(ServiceRequestContext ctx, HttpRequest req) throws Exception { final Object ret = function.serve(ctx, req, args); if (!(ret instanceof CompletionStage)) { return HttpResponse.ofFailed(new IllegalStateException( "illegal return type: " + ret.getClass().getSimpleName())); } @SuppressWarnings("unchecked") CompletionStage<HttpResponse> castStage = (CompletionStage<HttpResponse>) ret; return HttpResponse.from(castStage); } }