diff --git a/src/validation.cc b/src/validation.cc index 2c73902..cc7b703 100644 --- a/src/validation.cc +++ b/src/validation.cc @@ -9,48 +9,11 @@ #include #include -/** - * Check if a player belongs to a given room. - * - * @param player Pointer to the player object. - * @param room Pointer to the room object. - * @return `true` if the player belongs to the room, otherwise `false`. - */ -bool player_belongs_to_room(const Player *player, const Room *room) { - return std::find(room->players.begin(), room->players.end(), *player) != room->players.end(); -} - -/** - * Check if an action belongs to a given role. - * - * @param role Pointer to the role object. - * @param action Pointer to the action object. - * @return `true` if the action belongs to the role, otherwise `false`. - */ -bool action_belongs_to_role(const Role *role, const Action *action) { - return std::find(role->actions.begin(), role->actions.end(), *action) != role->actions.end(); -} - -/** - * Check if an action is allowed based on relevant events. - * - * @param action Pointer to the action object. - * @param relevantEvents Pointer to the vector of relevant events. - * @return `true` if the action is allowed, otherwise `false`. - */ -bool is_action_allowed(const Action *action, std::vector *relevant_events) { - bool allowed = false; // Actions are disabled by default - std::sort(relevant_events->begin(), relevant_events->end()); - for (const auto &event : *relevant_events) { - if (std::find(event.prohibits.begin(), event.prohibits.end(), *action) != event.prohibits.end()) { - allowed = false; - } - if (std::find(event.allows.begin(), event.allows.end(), *action) != event.allows.end()) { - allowed = true; - } - } - return allowed; -} +// These functions need to be declared to use the top-down rule and +// make them as module private functions. +bool player_belongs_to_room(const Player *player, const Room *room); +bool action_belongs_to_role(const Role *role, const Action *action); +bool is_action_allowed(const Action *action, std::vector *relevant_events); /** * Validate if an action is valid for a player in a room based on related events. @@ -98,6 +61,49 @@ ValidationStatus validate_action( return ValidationStatus::ActionValid; } +/** + * Check if a player belongs to a given room. + * + * @param player Pointer to the player object. + * @param room Pointer to the room object. + * @return `true` if the player belongs to the room, otherwise `false`. + */ +bool player_belongs_to_room(const Player *player, const Room *room) { + return std::find(room->players.begin(), room->players.end(), *player) != room->players.end(); +} + +/** + * Check if an action belongs to a given role. + * + * @param role Pointer to the role object. + * @param action Pointer to the action object. + * @return `true` if the action belongs to the role, otherwise `false`. + */ +bool action_belongs_to_role(const Role *role, const Action *action) { + return std::find(role->actions.begin(), role->actions.end(), *action) != role->actions.end(); +} + +/** + * Check if an action is allowed based on relevant events. + * + * @param action Pointer to the action object. + * @param relevantEvents Pointer to the vector of relevant events. + * @return `true` if the action is allowed, otherwise `false`. + */ +bool is_action_allowed(const Action *action, std::vector *relevant_events) { + bool allowed = false; // Actions are disabled by default + std::sort(relevant_events->begin(), relevant_events->end()); + for (const auto &event : *relevant_events) { + if (std::find(event.prohibits.begin(), event.prohibits.end(), *action) != event.prohibits.end()) { + allowed = false; + } + if (std::find(event.allows.begin(), event.allows.end(), *action) != event.allows.end()) { + allowed = true; + } + } + return allowed; +} + std::string ValidationStatusUtils::to_string(ValidationStatus status) { switch (status) { case ValidationStatus::PlayerNotInRoom: return "player not in room";