Maki
Formally verfied low-code orchestration
Loading...
Searching...
No Matches
pipeline.h
1#pragma once
2
3#include <QProcess>
4#include <QVector>
5#include <QWidget>
6#include <mutex>
7
8#include "ipipeline.h"
9#include "result.h"
10
21class Pipeline : public QObject, public maki::IPipeline
22{
23 Q_OBJECT
24public:
28 enum class State
29 {
30 Unknown,
31 Idle,
32 Running,
33 Aborting,
34 Done,
35 Error
36 };
37
39 {
40 QString name = "";
42 };
43
44 struct GroupInfo
45 {
46 QString name = "";
47 QVector<ProcessInfo> processes = {};
48 };
49
50 struct Info
51 {
52 QString current = "";
53 QString currentPath = "";
54 QVector<GroupInfo> groupInfo = {};
55 };
56
62 Pipeline(QObject* parent = nullptr);
63
67 ~Pipeline();
68
80 VoidResult add(QProcess* process, maki::OnFail onFail,
81 std::function<void(int& exitCode, QProcess::ExitStatus& status)> callback = nullptr) override;
82
91 VoidResult start();
92
98 QString name() const;
99
105 void setName(const QString& name);
106
112 int size() const;
113
119 bool isRunning() const;
120
129 VoidResult abort(bool syncAbort = false);
130
131 void startGroup(const QString& groupName) override;
132 void endGroup() override;
133
134 QWidget* progressWidget(bool subMenu = false) const;
135
136signals:
146 void startingProcess(const Info& info, const QString& process, const QStringList& arguments);
147
157 void processStarted(const Info& info, const QString& process, const QStringList& arguments);
158
166 void finished(const Info& info, int exitCode, QProcess::ExitStatus status);
167
175 void finishedLast(const Info& info, int exitCode, const QString& message);
176
182 void startingPipeline(const Info& info);
183
192 void startingGroup(const Info& info, const QString& groupName);
193
202 void finishedGroup(const Info& info, const QString& groupName, int exitCode, const QString& message);
203
209 void readyReadStandardOutput(const QByteArray& message);
210
216 void readyReadStandardError(const QByteArray& message);
217
225 void errorOccurred(const Info& info, QProcess::ProcessError error, const QString& message);
226
227private slots:
232
237
244 void onFinished(int exitCode, QProcess::ExitStatus status);
245
251 void onErrorOccurred(QProcess::ProcessError error);
252
253private:
258 {
260 QProcess* process = nullptr;
261
263 maki::OnFail onFail = maki::OnFail::STOP;
264
266 std::function<void(int& exitCode, QProcess::ExitStatus& status)> onFinish;
267
270 };
271
276 {
278 QString name = "";
279
281 std::vector<std::shared_ptr<PipelineProcess>> processes;
282
283 int size() const
284 {
285 return processes.size();
286 }
287
288 bool isEmpty() const
289 {
290 return processes.size() == 0;
291 }
292
293 int getNextIndex()
294 {
295 for (int i = 0; i < (int)processes.size(); ++i)
296 if (processes.at(i)->state == State::Idle)
297 return i;
298
299 return -1;
300 }
301 };
302
304 mutable std::mutex mStateMutex;
305 State mState;
306
308 QString mName;
309
311 std::shared_ptr<PipelineProcess> mRunningProcess;
312
313 uint32_t mGroupIndex;
314 QString mCurrentGroup;
315 std::vector<std::shared_ptr<PipelineGroup>> mGroups;
316
326 void startNextOrEnd(int exitCode, QProcess::ExitStatus status);
327
337 bool handleInputData(QByteArray& data) const;
338
339 void clearGroups();
340 int getIndexOfGroup(const QString& name) const;
341 int getIndexofFirstNonEmptyGroup() const;
342 std::shared_ptr<Pipeline::PipelineGroup> getGroup();
343
344 VoidResult start(const QString& groupName, bool first = false);
345
346 Info constructInfo() const;
347
348 QString getRunningTask(GroupInfo info) const;
349 bool tasksInError(GroupInfo info) const;
350 int getCompleteTasks(GroupInfo info) const;
351
352 void finishAbort();
353};
Executes and manages a sequence of external processes.
Definition pipeline.h:22
void startingGroup(const Info &info, const QString &groupName)
Emitted before a group starts.
State
Internal state of the pipeline execution.
Definition pipeline.h:29
@ Unknown
Not initialized.
Definition pipeline.h:30
@ Idle
Not running.
Definition pipeline.h:31
QString mName
Name of the pipeline.
Definition pipeline.h:308
VoidResult start()
Starts executing the pipeline.
Definition pipeline.cpp:219
VoidResult add(QProcess *process, maki::OnFail onFail, std::function< void(int &exitCode, QProcess::ExitStatus &status)> callback=nullptr) override
Adds a process to the pipeline.
Definition pipeline.cpp:191
void readyReadStandardError(const QByteArray &message)
Emitted when new data is available on the standard error stream.
void onReadyReadStandardOutput()
Slot triggered when the process produces standard output.
Definition pipeline.cpp:383
void finishedGroup(const Info &info, const QString &groupName, int exitCode, const QString &message)
Emitted when the last process in a group finishes.
VoidResult abort(bool syncAbort=false)
Aborts the currently running pipeline.
Definition pipeline.cpp:67
void processStarted(const Info &info, const QString &process, const QStringList &arguments)
Emitted after a process starts.
bool isRunning() const
Indicates whether the pipeline is currently running.
Definition pipeline.cpp:61
void finished(const Info &info, int exitCode, QProcess::ExitStatus status)
Emitted when the currently running process finishes.
void startingProcess(const Info &info, const QString &process, const QStringList &arguments)
Emitted before a process starts.
void onErrorOccurred(QProcess::ProcessError error)
Slot triggered when a process error occurs.
Definition pipeline.cpp:429
void errorOccurred(const Info &info, QProcess::ProcessError error, const QString &message)
Emitted when a process error occurs.
std::shared_ptr< PipelineProcess > mRunningProcess
Currently running process.
Definition pipeline.h:311
void onReadyReadStandardError()
Slot triggered when the process produces standard error output.
Definition pipeline.cpp:397
void setName(const QString &name)
Sets the pipeline name.
Definition pipeline.cpp:47
void finishedLast(const Info &info, int exitCode, const QString &message)
Emitted when the last process in the pipeline finishes.
Pipeline(QObject *parent=nullptr)
Constructs a Pipeline instance.
Definition pipeline.cpp:22
void readyReadStandardOutput(const QByteArray &message)
Emitted when new data is available on the standard output stream.
void onFinished(int exitCode, QProcess::ExitStatus status)
Slot triggered when a process finishes execution.
Definition pipeline.cpp:410
bool handleInputData(QByteArray &data) const
Processes incoming output data from the running process.
Definition pipeline.cpp:362
std::mutex mStateMutex
Mutex protecting access to the pipeline state.
Definition pipeline.h:304
void startNextOrEnd(int exitCode, QProcess::ExitStatus status)
Starts the next process or ends the pipeline.
Definition pipeline.cpp:296
void startingPipeline(const Info &info)
Emitted when the complete pipeline is started.
int size() const
Returns the number of processes registered in the pipeline.
Definition pipeline.cpp:52
QString name() const
Returns the pipeline name.
Definition pipeline.cpp:42
Definition pipeline.h:45
QVector< ProcessInfo > processes
Name of the group.
Definition pipeline.h:47
Definition pipeline.h:51
QString currentPath
Name of the current process.
Definition pipeline.h:53
QVector< GroupInfo > groupInfo
Name of the current process path.
Definition pipeline.h:54
Internal representation of a group of processes.
Definition pipeline.h:276
QString name
Name of the group.
Definition pipeline.h:278
std::vector< std::shared_ptr< PipelineProcess > > processes
Queue of processes waiting to be executed.
Definition pipeline.h:281
Internal representation of a process registered in the pipeline.
Definition pipeline.h:258
QProcess * process
Process to be executed.
Definition pipeline.h:260
maki::OnFail onFail
Policy describing behavior when the process fails.
Definition pipeline.h:263
std::function< void(int &exitCode, QProcess::ExitStatus &status)> onFinish
Optional callback executed when the process finishes.
Definition pipeline.h:266
State state
Current state of a single process.
Definition pipeline.h:269
Definition pipeline.h:39
State status
Name of the process.
Definition pipeline.h:41