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