feat(network): enhance Message validation and add EMPTY payload type

- Introduced `MessageStatus` for message validation and tracking.
- Added `EMPTY` payload type to `MessagePayloadType` for invalid or empty messages.
- Updated `Message` constructor to validate payload type and status.
- Implemented `getMessageStatus` to retrieve the message status.
This commit is contained in:
Kieran Kihn
2025-11-23 15:01:08 +08:00
parent 6c50c600bf
commit 7301a2c787
2 changed files with 39 additions and 4 deletions

View File

@@ -6,12 +6,42 @@
*/
#include "Message.h"
#include <stdexcept>
#include <utility>
namespace UNO::NETWORK {
Message::Message(MessagePayloadType messagePayloadType, MessagePayload messagePayload) :
messagePayloadType_(messagePayloadType), messagePayload_(std::move(messagePayload))
Message::Message(MessageStatus messageStatus, MessagePayloadType messagePayloadType, MessagePayload messagePayload) :
status_(messageStatus), messagePayloadType_(messagePayloadType), messagePayload_(std::move(messagePayload))
{
if (this->getMessageStatus() == MessageStatus::INVALID) {
if (this->getMessagePayloadType() != MessagePayloadType::EMPTY) {
throw std::invalid_argument("Invalid message: expected 'empty' payload type");
}
if (std::holds_alternative<std::monostate>(this->getMessagePayload()) == false) {
throw std::invalid_argument("Invalid message: expected std::monostate payload");
}
}
else {
if ((this->getMessagePayloadType() == MessagePayloadType::JOIN_GAME
&& std::holds_alternative<JoinGamePayload>(this->getMessagePayload()) == false)
|| (this->getMessagePayloadType() == MessagePayloadType::START_GAME
&& std::holds_alternative<StartGamePayload>(this->getMessagePayload()) == false)
|| (this->getMessagePayloadType() == MessagePayloadType::DRAW_CARD
&& std::holds_alternative<DrawCardPayload>(this->getMessagePayload()) == false)
|| (this->getMessagePayloadType() == MessagePayloadType::PLAY_CARD
&& std::holds_alternative<PlayCardPayload>(this->getMessagePayload()) == false)
|| (this->getMessagePayloadType() == MessagePayloadType::INIT_GAME
&& std::holds_alternative<InitGamePayload>(this->getMessagePayload()) == false)
|| (this->getMessagePayloadType() == MessagePayloadType::END_GAME
&& std::holds_alternative<EndGamePayload>(this->getMessagePayload()) == false)) {
throw std::invalid_argument("Invalid message: MessagePayloadType and MessagePayload do not match");
}
}
}
MessageStatus Message::getMessageStatus() const
{
return this->status_;
}
MessagePayloadType Message::getMessagePayloadType() const

View File

@@ -16,7 +16,7 @@
namespace UNO::NETWORK {
enum class MessagePayloadType { JOIN_GAME, START_GAME, DRAW_CARD, PLAY_CARD, INIT_GAME, END_GAME };
enum class MessagePayloadType { EMPTY, JOIN_GAME, START_GAME, DRAW_CARD, PLAY_CARD, INIT_GAME, END_GAME };
struct JoinGamePayload {
std::string playerName;
@@ -43,14 +43,19 @@ namespace UNO::NETWORK {
using MessagePayload =
std::variant<std::monostate, JoinGamePayload, StartGamePayload, DrawCardPayload, PlayCardPayload, InitGamePayload, EndGamePayload>;
enum class MessageStatus { OK, INVALID };
class Message {
private:
MessageStatus status_;
MessagePayloadType messagePayloadType_;
MessagePayload messagePayload_;
public:
Message(MessagePayloadType messagePayloadType, MessagePayload messagePayload);
Message(MessageStatus messageStatus, MessagePayloadType messagePayloadType, MessagePayload messagePayload);
[[nodiscard]] MessageStatus getMessageStatus() const;
[[nodiscard]] MessagePayloadType getMessagePayloadType() const;
[[nodiscard]] MessagePayload getMessagePayload() const;
};