11#include <promeki/config.h>
12#if PROMEKI_ENABLE_CORE
21PROMEKI_NAMESPACE_BEGIN
61 using Callback = Function<void(Error)>;
70 BufferRequest() =
default;
78 explicit BufferRequest(BufferCommand::Ptr cmd) : _cmd(std::move(cmd)) {}
88 static BufferRequest resolved(Error err) {
90 r._overrideError = err;
91 r._hasOverride =
true;
108 static BufferRequest resolved(BufferCommand::Ptr cmd) {
109 if (cmd.isValid()) cmd.modify()->markCompleted();
110 return BufferRequest(std::move(cmd));
129 Error wait(
unsigned int timeoutMs = 0) {
130 if (_hasOverride)
return _overrideError;
131 if (_cmd.isNull())
return Error::Invalid;
132 const Error waitErr = _cmd.modify()->waitForCompletion(timeoutMs);
133 if (waitErr == Error::Timeout)
return Error::Timeout;
141 bool isReady()
const {
142 if (_hasOverride)
return true;
143 return _cmd.isValid() && _cmd->isCompleted();
156 void then(Callback cb) {
158 EventLoop *loop = EventLoop::current();
159 Error err = _overrideError;
160 if (loop !=
nullptr) {
162 [cb = std::move(cb), err]()
mutable { cb(err); });
168 if (_cmd.isNull())
return;
169 _cmd.modify()->setCompletionCallback(std::move(cb), EventLoop::current());
181 _cancelledLocal =
true;
182 if (_cmd.isValid()) _cmd.modify()->cancelled.setValue(
true);
186 bool isCancelled()
const {
187 if (_cancelledLocal)
return true;
188 return _cmd.isValid() && _cmd->cancelled.value();
200 BufferCommand::Ptr command()
const {
return _cmd; }
217 template <
typename CmdT>
const CmdT *commandAs()
const {
218 if (_cmd.isNull())
return nullptr;
219 return static_cast<const CmdT *
>(_cmd.ptr());
223 bool isValid()
const {
return _cmd.isValid() || _hasOverride; }
226 BufferCommand::Ptr _cmd;
227 Error _overrideError = Error::Invalid;
228 bool _hasOverride =
false;
234 bool _cancelledLocal =
false;