diff --git a/src/network/Message.cpp b/src/network/Message.cpp index 85597b3..89a230e 100644 --- a/src/network/Message.cpp +++ b/src/network/Message.cpp @@ -6,12 +6,42 @@ */ #include "Message.h" +#include #include 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(this->getMessagePayload()) == false) { + throw std::invalid_argument("Invalid message: expected std::monostate payload"); + } + } + else { + if ((this->getMessagePayloadType() == MessagePayloadType::JOIN_GAME + && std::holds_alternative(this->getMessagePayload()) == false) + || (this->getMessagePayloadType() == MessagePayloadType::START_GAME + && std::holds_alternative(this->getMessagePayload()) == false) + || (this->getMessagePayloadType() == MessagePayloadType::DRAW_CARD + && std::holds_alternative(this->getMessagePayload()) == false) + || (this->getMessagePayloadType() == MessagePayloadType::PLAY_CARD + && std::holds_alternative(this->getMessagePayload()) == false) + || (this->getMessagePayloadType() == MessagePayloadType::INIT_GAME + && std::holds_alternative(this->getMessagePayload()) == false) + || (this->getMessagePayloadType() == MessagePayloadType::END_GAME + && std::holds_alternative(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 diff --git a/src/network/Message.h b/src/network/Message.h index 4ed4e8e..47e7f8c 100644 --- a/src/network/Message.h +++ b/src/network/Message.h @@ -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; + 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; };