Files
snipplib/include/snipplib/network/snplib_netmsg.h
2026-09-29 17:58:14 +03:00

94 lines
2.9 KiB
C++

#pragma once
#include "../utils/snplib_keyvalue_expr.h"
#include "snplib_network.h"
/*
A SIMPLE NETWORK MESSAGE IMPLEMENTATION
format:
keyword<key-value-delim-seq>value1<value-value-delim-seq>value2<value-value-delim-seq>value3...valueN
e.g.:
1) keyword-only:
'key1'
2) keyword-value (<key-value-delim-seq>=" "):
'key value'
2) keyword-value-seq (<key-value-delim-seq>=" =", <value-value-delim-seq>=", "):
'key = value1, value2, value3'
*/
namespace snplib
{
static constexpr char SNPLIB_DEFAULT_NETMSG_KEYVALUE_DELIM[] = "=";
static constexpr char SNPLIB_DEFAULT_NETMSG_VALUEVALUE_DELIM[] = ",";
template <char_range_c CharRangeT = std::vector<char>>
class keyval_netmsg_t : public keyvalue_expr_t<CharRangeT>
{
protected:
using base_t = keyvalue_expr_t<CharRangeT>;
public:
using typename base_t::config_t;
using result_t = std::expected<keyval_netmsg_t, typename base_t::error_t>;
keyval_netmsg_t(base_t::config_t config = {.keyval_delim = SNPLIB_DEFAULT_NETMSG_KEYVALUE_DELIM,
.valseq_delim = SNPLIB_DEFAULT_NETMSG_VALUEVALUE_DELIM})
: base_t(std::move(config))
{
}
keyval_netmsg_t(CharRangeT& r,
base_t::config_t config = {.keyval_delim = SNPLIB_DEFAULT_NETMSG_KEYVALUE_DELIM,
.valseq_delim = SNPLIB_DEFAULT_NETMSG_VALUEVALUE_DELIM})
: base_t(r, std::move(config))
{
}
~keyval_netmsg_t() = default;
template <char_range_c R>
static result_t fromBytes(R&& r,
base_t::config_t config = {.keyval_delim = SNPLIB_DEFAULT_NETMSG_KEYVALUE_DELIM,
.valseq_delim = SNPLIB_DEFAULT_NETMSG_VALUEVALUE_DELIM})
{
keyval_netmsg_t msg;
// deep copy
if constexpr (std::same_as<CharRangeT, std::remove_cvref_t<R>>) {
std::ranges::copy(std::forward<R>(r), std::back_inserter(msg._ownByteSeq));
return msg.fromCharRange(msg._ownByteSeq, std::move(config));
} else {
return msg.fromCharRange(std::forward<R>(r), std::move(config));
}
}
// to satisfy net_message_c-concept
static result_t fromBytes(std::span<const char> r,
base_t::config_t config = {.keyval_delim = SNPLIB_DEFAULT_NETMSG_KEYVALUE_DELIM,
.valseq_delim = SNPLIB_DEFAULT_NETMSG_VALUEVALUE_DELIM})
{
return keyval_netmsg_t::fromBytes(r, std::move(config));
}
template <char_range_c OR>
OR toBytes() const
{
return transform_char_range<OR>(this->_byteSeq);
}
std::vector<char> toBytes() const
{
return toBytes<std::vector<char>>();
}
};
static_assert(net_message_c<keyval_netmsg_t<>>, "!!!");
} // namespace snplib