mirror of
https://github.com/kierankihn/uno-game.git
synced 2025-12-27 02:13:18 +08:00
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:
@@ -6,12 +6,42 @@
|
|||||||
*/
|
*/
|
||||||
#include "Message.h"
|
#include "Message.h"
|
||||||
|
|
||||||
|
#include <stdexcept>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace UNO::NETWORK {
|
namespace UNO::NETWORK {
|
||||||
Message::Message(MessagePayloadType messagePayloadType, MessagePayload messagePayload) :
|
Message::Message(MessageStatus messageStatus, MessagePayloadType messagePayloadType, MessagePayload messagePayload) :
|
||||||
messagePayloadType_(messagePayloadType), messagePayload_(std::move(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
|
MessagePayloadType Message::getMessagePayloadType() const
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
|
|
||||||
namespace UNO::NETWORK {
|
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 {
|
struct JoinGamePayload {
|
||||||
std::string playerName;
|
std::string playerName;
|
||||||
@@ -43,14 +43,19 @@ namespace UNO::NETWORK {
|
|||||||
using MessagePayload =
|
using MessagePayload =
|
||||||
std::variant<std::monostate, JoinGamePayload, StartGamePayload, DrawCardPayload, PlayCardPayload, InitGamePayload, EndGamePayload>;
|
std::variant<std::monostate, JoinGamePayload, StartGamePayload, DrawCardPayload, PlayCardPayload, InitGamePayload, EndGamePayload>;
|
||||||
|
|
||||||
|
enum class MessageStatus { OK, INVALID };
|
||||||
|
|
||||||
class Message {
|
class Message {
|
||||||
private:
|
private:
|
||||||
|
MessageStatus status_;
|
||||||
|
|
||||||
MessagePayloadType messagePayloadType_;
|
MessagePayloadType messagePayloadType_;
|
||||||
MessagePayload messagePayload_;
|
MessagePayload messagePayload_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Message(MessagePayloadType messagePayloadType, MessagePayload messagePayload);
|
Message(MessageStatus messageStatus, MessagePayloadType messagePayloadType, MessagePayload messagePayload);
|
||||||
|
|
||||||
|
[[nodiscard]] MessageStatus getMessageStatus() const;
|
||||||
[[nodiscard]] MessagePayloadType getMessagePayloadType() const;
|
[[nodiscard]] MessagePayloadType getMessagePayloadType() const;
|
||||||
[[nodiscard]] MessagePayload getMessagePayload() const;
|
[[nodiscard]] MessagePayload getMessagePayload() const;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user