diff --git a/CMakeLists.txt b/CMakeLists.txt index 2977509..2c64b2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,11 @@ if(ADCLIB_BUILD_EXAM) target_link_libraries(device_exam PRIVATE ${PROJECT_NAME}) endif() +if(ADCLIB_BUILD_EXAM) + add_executable(netmsg_exam examples/netmsg_exam.cpp) + target_link_libraries(netmsg_exam PRIVATE ${PROJECT_NAME}) +endif() + include(GNUInstallDirs) install( TARGETS ${PROJECT_NAME} diff --git a/examples/netmsg_exam.cpp b/examples/netmsg_exam.cpp new file mode 100644 index 0000000..0f2451c --- /dev/null +++ b/examples/netmsg_exam.cpp @@ -0,0 +1,31 @@ +#include + +#include + +int main() +{ + adc::AdcNetworkMessage msg; + + std::println("is ACK: {}", msg.isACK()); + + msg.createSET("ATTR1", snplib::snplib_serialization_params_t{}, 10, std::vector{'V', 'A', 'L'}); + + std::println("KEY: <{}>", msg.key()); + + std::println("VALUE: <{}>", msg.value()); + + std::println("is SET: {}", msg.isSET()); + + std::println("is VALID: {}", msg.isValid()); + + + std::string str{"SET ATTRQ 32.235 dwejh kd2jl"}; + + msg.fromCharRange(str); + + std::println("KEY: <{}>", msg.key()); + + std::println("VALUE: <{}>", msg.value()); + + return 0; +} \ No newline at end of file diff --git a/include/adclib/adclib_netmsg.h b/include/adclib/adclib_netmsg.h index 5f65537..79b064b 100644 --- a/include/adclib/adclib_netmsg.h +++ b/include/adclib/adclib_netmsg.h @@ -42,6 +42,8 @@ public: using base_t::isValid; using base_t::key; + using base_t::value; + using base_t::valueSeq; AdcNetworkMessage() = default; @@ -70,6 +72,35 @@ public: return std::ranges::equal(this->_key, ADCLIB_NETMSG_KEYWORD_GET); } + error_t fromCharRange(snplib::snplib_input_char_range_c auto&& bytes) + requires(!std::same_as>) + { + if constexpr (requires(CharRangeT t) { t.clear(std::declval()); }) { + this->_ownByteSeq.clear(); + } else { + this->_ownByteSeq = CharRangeT(); + } + + std::ranges::copy(std::forward(bytes), std::back_inserter(this->_ownByteSeq)); + + return fromCharRange(this->_ownByteSeq); + } + + error_t fromCharRange(CharRangeT& bytes) + { + auto err = base_t::fromCharRange(bytes, {.keyval_delim = ADCLIB_NETMSG_KEYWORD_PARAM_DELIM, + .valseq_delim = ADCLIB_NETMSG_PARAM_PARAM_DELIM}); + if (err) { + return err; + } + + if (!std::ranges::contains(ADCLIB_NETMSG_VALID_KEYWORDS, key())) { + this->_isValid = false; + // return an error here!!! + } + + return {}; + } error_t createACK() { @@ -86,33 +117,56 @@ public: requires(sizeof...(ArgTs) > 0) error_t createSET(ATTR_NAME_T&& attr_name, ArgTs&&... args) { + this->_isValid = false; + auto err = this->setKeyValue(ADCLIB_NETMSG_KEYWORD_SET, std::forward(attr_name)); if (err) { return err; } - return this->appendValue(std::forward(args)...); + err = this->appendValue(std::forward(args)...); + if (err) { + return err; + } + + this->_isValid = true; + + return err; } template error_t createGET(ATTR_NAME_T&& attr_name, ArgTs&&... args) { + this->_isValid = false; + auto err = this->setKeyValue(ADCLIB_NETMSG_KEYWORD_GET, std::forward(attr_name)); if (err) { return err; } + this->_isValid = true; + if constexpr (sizeof...(ArgTs)) { - return this->appendValue(std::forward(args)...); + err = this->appendValue(std::forward(args)...); + if (err) { + this->_isValid = false; + } } - return {}; + return err; } template error_t createCMD(CMD_NAME_T&& cmd_name) { - return this->setKeyValue(ADCLIB_NETMSG_KEYWORD_CMD, std::forward(cmd_name)); + this->_isValid = false; + + auto err = this->setKeyValue(ADCLIB_NETMSG_KEYWORD_CMD, std::forward(cmd_name)); + if (!err) { + this->_isValid = true; + } + + return err; } };