Skip to content

Commit 896bacf

Browse files
committed
requesthandler: Add Compare and Assert
Usable for performing some basic logic functions. Not feature-complete.
1 parent 81b307e commit 896bacf

File tree

4 files changed

+78
-1
lines changed

4 files changed

+78
-1
lines changed

src/requesthandler/RequestHandler.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ const std::unordered_map<std::string, RequestMethodHandler> RequestHandler::_han
3333
{"TriggerHotkeyByName", &RequestHandler::TriggerHotkeyByName},
3434
{"TriggerHotkeyByKeySequence", &RequestHandler::TriggerHotkeyByKeySequence},
3535
{"Sleep", &RequestHandler::Sleep},
36+
{"Compare", &RequestHandler::Compare},
37+
{"Assert", &RequestHandler::Assert},
3638

3739
// Config
3840
{"GetPersistentData", &RequestHandler::GetPersistentData},

src/requesthandler/RequestHandler.h

+2
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ class RequestHandler {
5252
RequestResult TriggerHotkeyByName(const Request &);
5353
RequestResult TriggerHotkeyByKeySequence(const Request &);
5454
RequestResult Sleep(const Request &);
55+
RequestResult Compare(const Request &);
56+
RequestResult Assert(const Request &);
5557

5658
// Config
5759
RequestResult GetPersistentData(const Request &);

src/requesthandler/RequestHandler_General.cpp

+63-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,9 @@ RequestResult RequestHandler::TriggerHotkeyByKeySequence(const Request &request)
332332
}
333333

334334
/**
335-
* Sleeps for a time duration or number of frames. Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
335+
* Sleeps for a time duration or number of frames.
336+
*
337+
* Note: Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
336338
*
337339
* @requestField ?sleepMillis | Number | Number of milliseconds to sleep for (if `SERIAL_REALTIME` mode) | >= 0, <= 50000
338340
* @requestField ?sleepFrames | Number | Number of frames to sleep for (if `SERIAL_FRAME` mode) | >= 0, <= 10000
@@ -365,3 +367,63 @@ RequestResult RequestHandler::Sleep(const Request &request)
365367
return RequestResult::Error(RequestStatus::UnsupportedRequestBatchExecutionType);
366368
}
367369
}
370+
371+
/**
372+
* Compares the values of the two request fields, `left` and `right`.
373+
*
374+
* Note: Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
375+
*
376+
* @requestField left | Any | First request batch variable in comparison
377+
* @requestField right | Any | Second request batch variable in comparison
378+
*
379+
* @responseField result | Boolean | Whether the comparison is equal
380+
*
381+
* @requestType Compare
382+
* @complexity 4
383+
* @rpcVersion -1
384+
* @initialVersion 5.4.0
385+
* @category general
386+
* @api requests
387+
*/
388+
RequestResult RequestHandler::Compare(const Request &request)
389+
{
390+
if (!request.RequestData.contains("left") || !request.RequestData.contains("right"))
391+
return RequestResult::Error(RequestStatus::MissingRequestField, "One or more sides of the comparison are missing.");
392+
393+
bool result = request.RequestData["left"] == request.RequestData["right"];
394+
395+
json responseData;
396+
responseData["result"] = result;
397+
return RequestResult::Success(responseData);
398+
}
399+
400+
401+
/**
402+
* Returns an error if the value of `check` is not `true`.
403+
*
404+
* This can be useful to interrupt a request batch from proceeding if an assumed state does not match real-world state.
405+
*
406+
* Note: Only available in request batches with types `SERIAL_REALTIME` or `SERIAL_FRAME`.
407+
*
408+
* @requestField check | Boolean | Value to assert to be true
409+
*
410+
* @requestType Assert
411+
* @complexity 4
412+
* @rpcVersion -1
413+
* @initialVersion 5.4.0
414+
* @category general
415+
* @api requests
416+
*/
417+
RequestResult RequestHandler::Assert(const Request &request)
418+
{
419+
RequestStatus::RequestStatus statusCode;
420+
std::string comment;
421+
if (!request.ValidateBoolean("check", statusCode, comment))
422+
return RequestResult::Error(statusCode, comment);
423+
424+
bool check = request.RequestData["check"];
425+
if (!check)
426+
return RequestResult::Error(RequestStatus::AssertFailed, "Assertion failed.");
427+
428+
return RequestResult::Success();
429+
}

src/requesthandler/types/RequestStatus.h

+11
Original file line numberDiff line numberDiff line change
@@ -415,5 +415,16 @@ namespace RequestStatus {
415415
* @api enums
416416
*/
417417
CannotAct = 703,
418+
/**
419+
* Assertion failed.
420+
*
421+
* @enumIdentifier AssertFailed
422+
* @enumValue 704
423+
* @enumType RequestStatus
424+
* @rpcVersion -1
425+
* @initialVersion 5.4.0
426+
* @api enums
427+
*/
428+
AssertFailed = 704,
418429
};
419430
}

0 commit comments

Comments
 (0)