94 lines
2.9 KiB
C++
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
|