summaryrefslogtreecommitdiffstats
path: root/server/src/http_common.cppm
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/http_common.cppm')
-rw-r--r--server/src/http_common.cppm108
1 files changed, 9 insertions, 99 deletions
diff --git a/server/src/http_common.cppm b/server/src/http_common.cppm
index 606a5d5..f56c92b 100644
--- a/server/src/http_common.cppm
+++ b/server/src/http_common.cppm
@@ -51,119 +51,29 @@ struct supported_verb
51 51
52 supported_verb_t value; 52 supported_verb_t value;
53 53
54 supported_verb(supported_verb_t value) : value{value} {} 54 supported_verb(supported_verb_t value);
55 55
56 static auto from(bhttp::verb v) -> std::optional<supported_verb> 56 static auto from(bhttp::verb v) -> std::optional<supported_verb>;
57 {
58 switch (v)
59 {
60 case bhttp::verb::options:
61 return supported_verb::options;
62 case bhttp::verb::delete_:
63 return supported_verb::delete_;
64 case bhttp::verb::get:
65 return supported_verb::get;
66 case bhttp::verb::head:
67 return supported_verb::head;
68 case bhttp::verb::post:
69 return supported_verb::post;
70 case bhttp::verb::put:
71 return supported_verb::put;
72 default:
73 return std::nullopt;
74 }
75 }
76 57
77 operator bhttp::verb() const 58 operator bhttp::verb() const;
78 {
79 switch (value)
80 {
81 case supported_verb::options:
82 return bhttp::verb::options;
83 case supported_verb::delete_:
84 return bhttp::verb::delete_;
85 case supported_verb::get:
86 return bhttp::verb::get;
87 case supported_verb::head:
88 return bhttp::verb::head;
89 case supported_verb::post:
90 return bhttp::verb::post;
91 case supported_verb::put:
92 return bhttp::verb::put;
93 }
94 }
95}; 59};
96 60
97export struct verb_set 61export struct verb_set
98{ 62{
63 bool options : 1 = false;
99 bool delete_ : 1 = false; 64 bool delete_ : 1 = false;
100 bool get : 1 = false; 65 bool get : 1 = false;
101 bool head : 1 = false; 66 bool head : 1 = false;
102 bool post : 1 = false; 67 bool post : 1 = false;
103 bool put : 1 = false; 68 bool put : 1 = false;
104 bool options : 1 = false;
105 69
106 auto enable(supported_verb v) -> void 70 [[nodiscard]] auto with(supported_verb v) const noexcept -> verb_set;
107 { 71 [[nodiscard]] auto empty() const noexcept -> bool;
108 switch (v.value) 72 [[nodiscard]] auto to_string() const -> std::string;
109 {
110 case supported_verb::delete_:
111 delete_ = true;
112 break;
113 case supported_verb::get:
114 get = true;
115 break;
116 case supported_verb::head:
117 head = true;
118 break;
119 case supported_verb::post:
120 post = true;
121 break;
122 case supported_verb::put:
123 put = true;
124 break;
125 case supported_verb::options:
126 options = true;
127 break;
128 default:;
129 }
130 }
131 73
132 auto operator==(verb_set const& rhs) const noexcept -> bool = default; 74 auto operator==(verb_set const& rhs) const noexcept -> bool = default;
133
134 auto empty() const -> bool { return *this == verb_set{}; }
135
136 verb_set(std::initializer_list<supported_verb> vs)
137 {
138 for (auto const v : vs)
139 enable(v);
140 }
141
142 auto to_string() const -> std::string
143 {
144 std::ostringstream ss;
145 bool wrote = false;
146 auto write = [&](bhttp::verb v)
147 {
148 if (wrote)
149 ss << ", ";
150 ss << v;
151 wrote = true;
152 };
153 if (delete_)
154 write(bhttp::verb::delete_);
155 if (get)
156 write(bhttp::verb::get);
157 if (head)
158 write(bhttp::verb::head);
159 if (post)
160 write(bhttp::verb::post);
161 if (put)
162 write(bhttp::verb::put);
163 if (options)
164 write(bhttp::verb::options);
165 return ss.str();
166 }
167}; 75};
76static_assert(sizeof(verb_set) == 1);
77static_assert(alignof(verb_set) == 1);
168 78
169} // namespace routemon::http 79} // namespace routemon::http