forked from quickshell/quickshell
		
	io/process: add StdioCollector data stream parser
This commit is contained in:
		
							parent
							
								
									0224fa942b
								
							
						
					
					
						commit
						2b01a75679
					
				
					 3 changed files with 67 additions and 4 deletions
				
			
		| 
						 | 
					@ -111,3 +111,27 @@ void SplitParser::setSplitMarker(QString marker) {
 | 
				
			||||||
	this->mSplitMarkerChanged = true;
 | 
						this->mSplitMarkerChanged = true;
 | 
				
			||||||
	emit this->splitMarkerChanged();
 | 
						emit this->splitMarkerChanged();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void StdioCollector::parseBytes(QByteArray& incoming, QByteArray& buffer) {
 | 
				
			||||||
 | 
						buffer.append(incoming);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!this->mWaitForEnd) {
 | 
				
			||||||
 | 
							this->mData = buffer;
 | 
				
			||||||
 | 
							emit this->dataChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void StdioCollector::streamEnded(QByteArray& buffer) {
 | 
				
			||||||
 | 
						if (this->mWaitForEnd) {
 | 
				
			||||||
 | 
							this->mData = buffer;
 | 
				
			||||||
 | 
							emit this->dataChanged();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						emit this->streamFinished();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void StdioCollector::setWaitForEnd(bool waitForEnd) {
 | 
				
			||||||
 | 
						if (waitForEnd == this->mWaitForEnd) return;
 | 
				
			||||||
 | 
						this->mWaitForEnd = waitForEnd;
 | 
				
			||||||
 | 
						emit this->waitForEndChanged();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <qbytearray.h>
 | 
					#include <qbytearray.h>
 | 
				
			||||||
 | 
					#include <qcontainerfwd.h>
 | 
				
			||||||
#include <qlocalsocket.h>
 | 
					#include <qlocalsocket.h>
 | 
				
			||||||
#include <qobject.h>
 | 
					#include <qobject.h>
 | 
				
			||||||
#include <qqmlintegration.h>
 | 
					#include <qqmlintegration.h>
 | 
				
			||||||
| 
						 | 
					@ -61,8 +62,8 @@ signals:
 | 
				
			||||||
	void read(QString data);
 | 
						void read(QString data);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
///! Parser for delimited data streams.
 | 
					///! DataStreamParser for delimited data streams.
 | 
				
			||||||
/// Parser for delimited data streams. @@read() is emitted once per delimited chunk of the stream.
 | 
					/// DataStreamParser for delimited data streams. @@read() is emitted once per delimited chunk of the stream.
 | 
				
			||||||
class SplitParser: public DataStreamParser {
 | 
					class SplitParser: public DataStreamParser {
 | 
				
			||||||
	Q_OBJECT;
 | 
						Q_OBJECT;
 | 
				
			||||||
	/// The delimiter for parsed data. May be multiple characters. Defaults to `\n`.
 | 
						/// The delimiter for parsed data. May be multiple characters. Defaults to `\n`.
 | 
				
			||||||
| 
						 | 
					@ -88,3 +89,41 @@ private:
 | 
				
			||||||
	QString mSplitMarker = "\n";
 | 
						QString mSplitMarker = "\n";
 | 
				
			||||||
	bool mSplitMarkerChanged = false;
 | 
						bool mSplitMarkerChanged = false;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					///! DataStreamParser that collects all output into a buffer
 | 
				
			||||||
 | 
					/// StdioCollector collects all process output into a buffer exposed as @@text or @@data.
 | 
				
			||||||
 | 
					class StdioCollector: public DataStreamParser {
 | 
				
			||||||
 | 
						Q_OBJECT;
 | 
				
			||||||
 | 
						QML_ELEMENT;
 | 
				
			||||||
 | 
						/// The stdio buffer exposed as text. if @@waitForEnd is true, this will not change
 | 
				
			||||||
 | 
						/// until the stream ends.
 | 
				
			||||||
 | 
						Q_PROPERTY(QString text READ text NOTIFY dataChanged);
 | 
				
			||||||
 | 
						/// The stdio buffer exposed as an [ArrayBuffer]. if @@waitForEnd is true, this will not change
 | 
				
			||||||
 | 
						/// until the stream ends.
 | 
				
			||||||
 | 
						///
 | 
				
			||||||
 | 
						/// [ArrayBuffer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer
 | 
				
			||||||
 | 
						Q_PROPERTY(QByteArray data READ data NOTIFY dataChanged);
 | 
				
			||||||
 | 
						/// If true, @@text and @@data will not be updated until the stream ends. Defaults to true.
 | 
				
			||||||
 | 
						Q_PROPERTY(bool waitForEnd READ waitForEnd WRITE setWaitForEnd NOTIFY waitForEndChanged);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						explicit StdioCollector(QObject* parent = nullptr): DataStreamParser(parent) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						void parseBytes(QByteArray& incoming, QByteArray& buffer) override;
 | 
				
			||||||
 | 
						void streamEnded(QByteArray& buffer) override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[[nodiscard]] QString text() const { return this->mData; }
 | 
				
			||||||
 | 
						[[nodiscard]] QByteArray data() const { return this->mData; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						[[nodiscard]] bool waitForEnd() const { return this->mWaitForEnd; }
 | 
				
			||||||
 | 
						void setWaitForEnd(bool waitForEnd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					signals:
 | 
				
			||||||
 | 
						void waitForEndChanged();
 | 
				
			||||||
 | 
						void dataChanged();
 | 
				
			||||||
 | 
						void streamFinished();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
						bool mWaitForEnd = true;
 | 
				
			||||||
 | 
						QByteArray mData;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,8 +22,8 @@
 | 
				
			||||||
/// Process {
 | 
					/// Process {
 | 
				
			||||||
///   running: true
 | 
					///   running: true
 | 
				
			||||||
///   command: [ "some-command", "arg" ]
 | 
					///   command: [ "some-command", "arg" ]
 | 
				
			||||||
///   stdout: SplitParser {
 | 
					///   stdout: @@StdioCollector {
 | 
				
			||||||
///     onRead: data => console.log(`line read: ${data}`)
 | 
					///     onStreamFinished: console.log(`line read: ${this.text}`)
 | 
				
			||||||
///   }
 | 
					///   }
 | 
				
			||||||
/// }
 | 
					/// }
 | 
				
			||||||
/// ```
 | 
					/// ```
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue