#pragma once
#include <string>
#include <vector>
#include <memory>
#include <drogon/IOThreadStorage.h>
#include <drogon/HttpResponse.h>
#include "HttpRequestImpl.h"
namespace drogon
{
class HttpMiddlewareBase;
struct ControllerBinderBase
{
    std::string handlerName_;
    std::vector<std::string> middlewareNames_;
    std::vector<std::shared_ptr<HttpMiddlewareBase>> middlewares_;
    IOThreadStorage<HttpResponsePtr> responseCache_;
    std::shared_ptr<std::string> corsMethods_;
    bool isCORS_{false};
    virtual ~ControllerBinderBase() = default;
    virtual void handleRequest(
        const HttpRequestImplPtr &req,
        std::function<void(const HttpResponsePtr &)> &&callback) const = 0;
    virtual bool isStreamHandler() const
    {
        return false;
    }
};
struct RouteResult
{
    enum
    {
        Success,
        MethodNotAllowed,
        NotFound
    } result;
    std::shared_ptr<ControllerBinderBase> binderPtr;
};
}  