module handy_http_primitives.handler;

import handy_http_primitives.request;
import handy_http_primitives.response;

/**
 * Defines the request handler interface, which is called upon to handle an
 * incoming HTTP request.
 */
interface HttpRequestHandler {
    /**
     * Invoked to handle an incoming HTTP request. Implementations should read
     * information from the request, and write to the response.
     * Params:
     *   request = The request that was sent by a client.
     *   response = The response that will be sent back to the client.
     */
    void handle(ref ServerHttpRequest request, ref ServerHttpResponse response);

    /**
     * Gets a request handler that invokes the given function.
     * Params:
     *   fn = The function to invoke when handling requests.
     * Returns: The request handler.
     */
    static HttpRequestHandler of(void function(ref ServerHttpRequest, ref ServerHttpResponse) fn) {
        return new class HttpRequestHandler {
            override void handle(ref ServerHttpRequest request, ref ServerHttpResponse response) {
                fn(request, response);
            }
        };
    }

    /**
     * Gets a request handler that invokes the given delegate.
     * Params:
     *   dg = The delegate to invoke when handling requests.
     * Returns: The request handler.
     */
    static HttpRequestHandler of(void delegate(ref ServerHttpRequest, ref ServerHttpResponse) dg) {
        return new class HttpRequestHandler {
            override void handle(ref ServerHttpRequest request, ref ServerHttpResponse response) {
                dg(request, response);
            }
        };
    }
}