5 #include "dispatchtypepath_p.h"
8 #include "controller.h"
12 #include <QRegularExpression>
19 d_ptr(new DispatchTypePathPrivate)
23 DispatchTypePath::~DispatchTypePath()
32 QRegularExpression multipleSlashes(QLatin1String(
"/{1,}"));
34 QVector<QStringList> table;
36 QStringList keys = d->paths.keys();
37 keys.sort(Qt::CaseInsensitive);
38 for (
const QString &path : keys) {
39 const auto paths = d->paths.value(path);
40 for (
Action *action : paths) {
41 QString _path = QLatin1Char(
'/') + path;
42 if (action->attribute(QLatin1String(
"Args")).isEmpty()) {
43 _path.append(QLatin1String(
"/..."));
45 for (
int i = 0; i < action->numberOfArgs(); ++i) {
46 _path.append(QLatin1String(
"/*"));
49 _path.replace(multipleSlashes, QLatin1String(
"/"));
51 QString privateName = action->reverse();
52 if (!privateName.startsWith(QLatin1Char(
'/'))) {
53 privateName.prepend(QLatin1Char(
'/'));
56 table.append({ _path, privateName });
60 return Utils::buildTable(table, { QLatin1String(
"Path"), QLatin1String(
"Private") },
61 QLatin1String(
"Loaded Path actions:"));
69 if (_path.isEmpty()) {
70 _path = QStringLiteral(
"/");
73 const auto it = d->paths.constFind(_path);
74 if (it == d->paths.constEnd()) {
79 int numberOfArgs = args.size();
80 for (
Action *action : it.value()) {
84 if (action->numberOfArgs() == numberOfArgs) {
85 Request *request = c->request();
90 }
else if (action->numberOfArgs() == -1 &&
94 Request *request = c->request();
110 const auto range = attributes.equal_range(QLatin1String(
"Path"));
111 for (
auto i = range.first; i != range.second; ++i) {
112 if (d->registerPath(*i, action)) {
124 return !d->paths.isEmpty();
130 if (captures.isEmpty()) {
132 auto it = attributes.constFind(QStringLiteral(
"Path"));
133 if (it != attributes.constEnd()) {
134 const QString &path = it.value();
135 if (path.isEmpty()) {
136 ret = QStringLiteral(
"/");
137 }
else if (!path.startsWith(QLatin1Char(
'/'))) {
138 ret = QLatin1Char(
'/') + path;
147 bool DispatchTypePathPrivate::registerPath(
const QString &path,
Action *action)
149 QString _path = path;
150 if (_path.startsWith(QLatin1Char(
'/')) && !_path.isEmpty()) {
153 if (_path.isEmpty()) {
154 _path = QStringLiteral(
"/");
157 auto it = paths.find(_path);
158 if (it != paths.end()) {
160 for (
const Action *regAction : it.value()) {
161 if (regAction->numberOfArgs() == actionNumberOfArgs) {
162 qCCritical(CUTELYST_DISPATCHER_PATH) <<
"Not registering Action"
166 <<
"because it conflicts with"
169 << regAction->controller()->objectName();
174 it.value().push_back(action);
175 std::sort(it.value().begin(), it.value().end(), [](
Action *a,
Action *b) ->
bool {
176 return a->numberOfArgs() < b->numberOfArgs();
179 paths.insert(_path, { action });
184 #include "moc_dispatchtypepath.cpp"
This class represents a Cutelyst Action.
virtual qint8 numberOfArgs() const noexcept
ParamsMultiMap attributes() const noexcept
Controller * controller() const
virtual MatchType match(Context *c, const QString &path, const QStringList &args) const override
DispatchTypePath(QObject *parent=nullptr)
virtual QByteArray list() const override
list the registered actions To be implemented by subclasses
virtual bool inUse() override
virtual QString uriForAction(Action *action, const QStringList &captures) const override
virtual bool registerAction(Action *action) override
registerAction
void setupMatchedAction(Context *c, Action *action) const
void setArguments(const QStringList &arguments)
void setMatch(const QString &match)
The Cutelyst namespace holds all public Cutelyst API.