Files
nuki_hub/lib/PsychicHttp/src/PsychicMiddlewareChain.cpp
2024-12-30 14:37:09 +01:00

47 lines
1.2 KiB
C++

#include "PsychicMiddlewareChain.h"
PsychicMiddlewareChain::~PsychicMiddlewareChain()
{
for (auto middleware : _middleware)
if (middleware->_freeOnRemoval)
delete middleware;
_middleware.clear();
}
void PsychicMiddlewareChain::addMiddleware(PsychicMiddleware* middleware)
{
_middleware.push_back(middleware);
}
void PsychicMiddlewareChain::addMiddleware(PsychicMiddlewareCallback fn)
{
PsychicMiddlewareFunction* closure = new PsychicMiddlewareFunction(fn);
closure->_freeOnRemoval = true;
_middleware.push_back(closure);
}
void PsychicMiddlewareChain::removeMiddleware(PsychicMiddleware* middleware)
{
_middleware.remove(middleware);
if (middleware->_freeOnRemoval)
delete middleware;
}
esp_err_t PsychicMiddlewareChain::runChain(PsychicRequest* request, PsychicMiddlewareNext finalizer)
{
if (_middleware.size() == 0)
return finalizer();
PsychicMiddlewareNext next;
std::list<PsychicMiddleware*>::iterator it = _middleware.begin();
next = [this, &next, &it, request, finalizer]() {
if (it == _middleware.end())
return finalizer();
PsychicMiddleware* m = *it;
it++;
return m->run(request, request->response(), next);
};
return next();
}