cutelyst 5.0.0
A C++ Web Framework built on top of Qt, using the simple approach of Catalyst (Perl) framework.
actionchain.cpp
1/*
2 * SPDX-FileCopyrightText: (C) 2015-2022 Daniel Nicoletti <dantti12@gmail.com>
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5#include "actionchain_p.h"
6#include "context_p.h"
7#include "request_p.h"
8
9using namespace Cutelyst;
10using namespace Qt::StringLiterals;
11
13 : Action(new ActionChainPrivate, parent)
14{
15 Q_D(ActionChain);
16 d->chain = chain;
17
18 const Action *final = d->chain.last();
19
20 QVariantHash args;
21 args.insert(u"namespace"_s, final->ns());
22 setupAction(args, nullptr);
23
24 setName(u'_' + final->name());
25 setReverse(final->reverse());
26 setAttributes(final->attributes());
27 setController(final->controller());
28
29 for (Action *action : chain) {
30 // FINAL should not have captures?
31 if (/*action != final && */ action->numberOfCaptures() > 0) {
32 d->captures += action->numberOfCaptures();
33 }
34 }
35}
36
38{
39 Q_D(const ActionChain);
40 return d->chain;
41}
42
43qint8 ActionChain::numberOfCaptures() const noexcept
44{
45 Q_D(const ActionChain);
46 return d->captures;
47}
48
50{
51 Q_D(const ActionChain);
52
53 Request *request = c->request();
54 const QStringList captures = request->captures();
55 const QStringList currentArgs = request->args();
56 const ActionList localChain = d->chain;
57
58 int &actionRefCount = c->d_ptr->actionRefCount;
59 int &captured = c->d_ptr->chainedCaptured;
60 int &chainedIx = c->d_ptr->chainedIx;
61
62 for (; chainedIx < localChain.size(); ++chainedIx) {
63 if (actionRefCount) {
64 c->d_ptr->pendingAsync.prepend(this);
65 request->setArguments(currentArgs);
66 break;
67 }
68
69 Action *action = localChain.at(chainedIx);
70
71 QStringList args;
72 while (args.size() < action->numberOfCaptures() && captured < captures.size()) {
73 args.append(captures.at(captured++));
74 }
75
76 // Final action gets args instead of captures
77 request->setArguments(action != localChain.last() ? args : currentArgs);
78 ++actionRefCount;
79 const bool ret = action->dispatch(c);
80 --actionRefCount;
81 if (!ret) {
82 return false;
83 }
84 }
85
86 return true;
87}
88
89#include "moc_actionchain.cpp"
Holds a chain of Cutelyst actions.
Definition actionchain.h:26
ActionChain(const ActionList &chain, QObject *parent=nullptr)
qint8 numberOfCaptures() const noexcept override
ActionList chain() const noexcept
bool doExecute(Context *c) override
This class represents a Cutelyst Action.
Definition action.h:35
void setAttributes(const ParamsMultiMap &attributes)
Definition action.cpp:80
void setupAction(const QVariantHash &args, Application *app)
Definition action.cpp:47
bool dispatch(Context *c)
Definition action.h:88
virtual qint8 numberOfCaptures() const
Definition action.cpp:130
void setController(Controller *controller)
Definition action.cpp:41
void setReverse(const QString &reverse)
Definition component.cpp:51
void setName(const QString &name)
Definition component.cpp:39
The Cutelyst Context.
Definition context.h:42
Request * request
Definition context.h:71
A request.
Definition request.h:42
QStringList captures() const noexcept
Definition request.cpp:161
void setArguments(const QStringList &arguments)
Definition request.cpp:155
The Cutelyst namespace holds all public Cutelyst API.
void append(QList::parameter_type value)
QList::const_reference at(qsizetype i) const const
T & last()
qsizetype size() const const