1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: Copyright OpenBMC Authors 3 #pragma once 4 5 #include "privileges.hpp" 6 #include "sserule.hpp" 7 #include "verb.hpp" 8 #include "websocketrule.hpp" 9 10 #include <boost/beast/http/verb.hpp> 11 12 #include <array> 13 #include <cstddef> 14 #include <initializer_list> 15 #include <optional> 16 17 namespace crow 18 { 19 template <typename T> 20 struct RuleParameterTraits 21 { 22 private: 23 RuleParameterTraits() = default; 24 friend T; 25 26 public: 27 using self_t = T; websocketcrow::RuleParameterTraits28 WebSocketRule& websocket() 29 { 30 self_t* self = static_cast<self_t*>(this); 31 WebSocketRule* p = new WebSocketRule(self->rule); 32 p->privilegesSet = self->privilegesSet; 33 self->ruleToUpgrade.reset(p); 34 return *p; 35 } 36 serverSentEventcrow::RuleParameterTraits37 SseSocketRule& serverSentEvent() 38 { 39 self_t* self = static_cast<self_t*>(this); 40 SseSocketRule* p = new SseSocketRule(self->rule); 41 self->ruleToUpgrade.reset(p); 42 return *p; 43 } 44 methodscrow::RuleParameterTraits45 self_t& methods(boost::beast::http::verb method) 46 { 47 self_t* self = static_cast<self_t*>(this); 48 std::optional<HttpVerb> verb = httpVerbFromBoost(method); 49 if (verb) 50 { 51 self->methodsBitfield = 1U << static_cast<size_t>(*verb); 52 } 53 return *self; 54 } 55 56 template <typename... MethodArgs> methodscrow::RuleParameterTraits57 self_t& methods(boost::beast::http::verb method, MethodArgs... argsMethod) 58 { 59 self_t* self = static_cast<self_t*>(this); 60 methods(argsMethod...); 61 std::optional<HttpVerb> verb = httpVerbFromBoost(method); 62 if (verb) 63 { 64 self->methodsBitfield |= 1U << static_cast<size_t>(*verb); 65 } 66 return *self; 67 } 68 notFoundcrow::RuleParameterTraits69 self_t& notFound() 70 { 71 self_t* self = static_cast<self_t*>(this); 72 self->isNotFound = true; 73 self->methodsBitfield = 0; 74 return *self; 75 } 76 methodNotAllowedcrow::RuleParameterTraits77 self_t& methodNotAllowed() 78 { 79 self_t* self = static_cast<self_t*>(this); 80 self->isMethodNotAllowed = true; 81 self->methodsBitfield = 0; 82 return *self; 83 } 84 privilegescrow::RuleParameterTraits85 self_t& privileges( 86 const std::initializer_list<std::initializer_list<const char*>>& p) 87 { 88 self_t* self = static_cast<self_t*>(this); 89 for (const std::initializer_list<const char*>& privilege : p) 90 { 91 self->privilegesSet.emplace_back(privilege); 92 } 93 return *self; 94 } 95 96 template <size_t N, typename... MethodArgs> privilegescrow::RuleParameterTraits97 self_t& privileges(const std::array<redfish::Privileges, N>& p) 98 { 99 self_t* self = static_cast<self_t*>(this); 100 for (const redfish::Privileges& privilege : p) 101 { 102 self->privilegesSet.emplace_back(privilege); 103 } 104 return *self; 105 } 106 }; 107 } // namespace crow 108