cutelyst  5.0.1
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 
9 using namespace Cutelyst;
10 using 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 
43 qint8 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  if (!action->dispatch(c)) {
79  return false;
80  }
81  }
82 
83  return true;
84 }
85 
86 #include "moc_actionchain.cpp"
void setName(const QString &name)
Definition: component.cpp:39
Request request
Definition: context.h:72
bool dispatch(Context *c)
Definition: action.h:88
void setReverse(const QString &reverse)
Definition: component.cpp:51
virtual qint8 numberOfCaptures() const
Definition: action.cpp:130
qint8 numberOfCaptures() const noexcept override
Definition: actionchain.cpp:43
const_reference at(qsizetype i) const const
Holds a chain of Cutelyst actions.
Definition: actionchain.h:25
qsizetype size() const const
This class represents a Cutelyst Action.
Definition: action.h:34
The Cutelyst Context.
Definition: context.h:42
bool doExecute(Context *c) override
Definition: actionchain.cpp:49
ActionList chain() const noexcept
Definition: actionchain.cpp:37
void setAttributes(const ParamsMultiMap &attributes)
Definition: action.cpp:80
The Cutelyst namespace holds all public Cutelyst API.
void setArguments(const QStringList &arguments)
Definition: request.cpp:155
void setController(Controller *controller)
Definition: action.cpp:41
QStringList captures() const noexcept
Definition: request.cpp:161
void append(QList< T > &&value)
void setupAction(const QVariantHash &args, Application *app)
Definition: action.cpp:47
T & last()
ActionChain(const ActionList &chain, QObject *parent=nullptr)
Definition: actionchain.cpp:12
A request.
Definition: request.h:41