| #pragma once | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <iostream> // NOLINT | |
| #include <optional> | |
| #include <string_view> | |
| #include "boost/beast/http/verb.hpp" //NOLINT | |
| enum class HttpVerb : std::uint8_t { | |
| Delete = 0, | |
| Get, | |
| Head, | |
| Options, | |
| Patch, | |
| Post, | |
| Put, | |
| Max, | |
| }; | |
| static constexpr size_t maxVerbIndex = static_cast<size_t>(HttpVerb::Max) - 1U; | |
| // MaxVerb + 1 is designated as the "not found" verb. It is done this way | |
| // to keep the BaseRule as a single bitfield (thus keeping the struct small) | |
| // while still having a way to declare a route a "not found" route. | |
| static constexpr const size_t notFoundIndex = maxVerbIndex + 1; | |
| static constexpr const size_t methodNotAllowedIndex = notFoundIndex + 1; | |
| inline std::optional<HttpVerb> httpVerbFromBoost(boost::beast::http::verb bv) { | |
| switch (bv) { | |
| case boost::beast::http::verb::delete_: | |
| return HttpVerb::Delete; | |
| case boost::beast::http::verb::get: | |
| return HttpVerb::Get; | |
| case boost::beast::http::verb::head: | |
| return HttpVerb::Head; | |
| case boost::beast::http::verb::options: | |
| return HttpVerb::Options; | |
| case boost::beast::http::verb::patch: | |
| return HttpVerb::Patch; | |
| case boost::beast::http::verb::post: | |
| return HttpVerb::Post; | |
| case boost::beast::http::verb::put: | |
| return HttpVerb::Put; | |
| default: | |
| return std::nullopt; | |
| } | |
| return std::nullopt; | |
| } | |
| inline std::string_view httpVerbToString(HttpVerb verb) { | |
| switch (verb) { | |
| case HttpVerb::Delete: | |
| return "DELETE"; | |
| case HttpVerb::Get: | |
| return "GET"; | |
| case HttpVerb::Head: | |
| return "HEAD"; | |
| case HttpVerb::Patch: | |
| return "PATCH"; | |
| case HttpVerb::Post: | |
| return "POST"; | |
| case HttpVerb::Put: | |
| return "PUT"; | |
| case HttpVerb::Options: | |
| return "OPTIONS"; | |
| case HttpVerb::Max: | |
| return ""; | |
| } | |
| // Should never reach here | |
| return ""; | |
| } | |
| inline std::string_view boostVerbToString(boost::beast::http::verb bv) { | |
| std::optional<HttpVerb> verb = httpVerbFromBoost(bv); | |
| if (!verb) { | |
| return ""; | |
| } | |
| return httpVerbToString(*verb); | |
| } |