67 lines
1.3 KiB
C++
67 lines
1.3 KiB
C++
namespace seafire::protocol
|
|
{
|
|
|
|
template<typename H>
|
|
bool
|
|
has(message_t const& m)
|
|
{
|
|
// FIXME: Parse header as well, to make sure it is valid.
|
|
return m.headers().contains(H::name);
|
|
}
|
|
|
|
template<typename H>
|
|
bool
|
|
has_quick(message_t const& m)
|
|
{
|
|
return m.headers().contains(H::name);
|
|
}
|
|
|
|
template<typename H>
|
|
std::optional<traits::alias_type_t<H>>
|
|
get(message_t const& m)
|
|
{
|
|
std::error_code ignored_ec;
|
|
return get<H>(m, ignored_ec);
|
|
}
|
|
|
|
template<typename H>
|
|
std::optional<traits::alias_type_t<H>>
|
|
get(message_t const& m, std::error_code& ec)
|
|
{
|
|
return H::try_parse(m.headers().get(H::name), ec);
|
|
}
|
|
|
|
template<typename H, typename... Args>
|
|
void
|
|
set(message_t& m, Args&&... args)
|
|
{
|
|
using type = traits::alias_type_t<H>;
|
|
|
|
if constexpr (traits::has_overridden_to_string_v<H>) {
|
|
m.set_header(H::name, H::to_string(type{std::forward<Args>(args)...}));
|
|
}
|
|
else {
|
|
using std::to_string;
|
|
m.set_header(H::name, to_string(type{std::forward<Args>(args)...}));
|
|
}
|
|
}
|
|
|
|
template<typename H, typename... Args>
|
|
void
|
|
set_if_not_set(message_t& m, Args&&... args)
|
|
{
|
|
if (has_quick<H>())
|
|
return;
|
|
|
|
set<H>(m, std::forward<Args>(args)...);
|
|
}
|
|
|
|
template<typename H>
|
|
void
|
|
erase(message_t& m)
|
|
{
|
|
m.erase_header(H::name);
|
|
}
|
|
|
|
} // namespace seafire::protocol
|