11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
20PROMEKI_NAMESPACE_BEGIN
30class StreamStringIODevice :
public IODevice {
31 PROMEKI_OBJECT(StreamStringIODevice, IODevice)
34 using OnNewLineFunc = Function<bool(String &)>;
40 StreamStringIODevice(ObjectBase *parent =
nullptr) : IODevice(parent) {}
46 void setOnNewLine(OnNewLineFunc func) { _onNewLine = std::move(func); }
52 const String &line()
const {
return _line; }
55 void clearLine() { _line.clear(); }
58 Error open(OpenMode mode)
override {
59 if (isOpen())
return Error(Error::AlreadyOpen);
65 Error close()
override {
71 bool isOpen()
const override {
return openMode() != NotOpen; }
74 int64_t read(
void *, int64_t)
override {
return -1; }
82 int64_t write(
const void *data, int64_t maxSize)
override {
83 if (!isOpen() || !isWritable())
return -1;
84 const char *p =
static_cast<const char *
>(data);
85 for (int64_t i = 0; i < maxSize; i++) {
96 void flush()
override { flushLine(); }
99 bool isSequential()
const override {
return true; }
102 OnNewLineFunc _onNewLine;
106 if (!_line.isEmpty() && _onNewLine) {
107 if (_onNewLine(_line)) _line.clear();
139 using OnNewLineFunc = Function<bool(String &)>;
142 StreamString() : _stream(&_device) { _device.open(IODevice::WriteOnly); }
148 StreamString(OnNewLineFunc func) : _stream(&_device) {
149 _device.setOnNewLine(std::move(func));
150 _device.open(IODevice::WriteOnly);
154 StreamString(
const StreamString &) =
delete;
156 StreamString &operator=(
const StreamString &) =
delete;
158 StreamString(StreamString &&) =
delete;
160 StreamString &operator=(StreamString &&) =
delete;
166 TextStream &stream() {
return _stream; }
172 void setOnNewLine(OnNewLineFunc func) {
173 _device.setOnNewLine(std::move(func));
181 const String &line()
const {
return _device.line(); }
190 StreamStringIODevice _device;