#pragma once #include #include #include "asibfm700_common.h" namespace asibfm700 { namespace details { template static constexpr auto merge_arrays(const std::array& arr1, const std::array& arr2) { constexpr auto N = N1 + N2; std::array res; for (size_t i = 0; i < N1; ++i) { res[i] = arr1[i]; } for (size_t i = N1; i < N; ++i) { res[i] = arr2[i - N1]; } return res; } } // namespace details constexpr static std::string_view ASIBFM700_COMMPROTO_KEYWORD_METEO_STR{"METEO"}; struct Asibfm700NetMessageValidKeywords { static constexpr std::array NETMSG_VALID_KEYWORDS = details::merge_arrays(mcc::network::MccNetMessageValidKeywords::NETMSG_VALID_KEYWORDS, std::array{ASIBFM700_COMMPROTO_KEYWORD_METEO_STR}); // hashes of valid keywords static constexpr std::array NETMSG_VALID_KEYWORD_HASHES = [](std::index_sequence) { return std::array{mcc::utils::FNV1aHash(NETMSG_VALID_KEYWORDS[Is])...}; }(std::make_index_sequence()); constexpr static const size_t* isKeywordValid(std::string_view key) { const auto hash = mcc::utils::FNV1aHash(key); for (auto const& h : NETMSG_VALID_KEYWORD_HASHES) { if (h == hash) { return &h; } } return nullptr; } }; template class Asibfm700MountNetMessage : public mcc::network::MccNetMessage { protected: using base_t = mcc::network::MccNetMessage; public: using base_t::base_t; template std::expected paramValue(size_t idx) { return paramValue(idx, _defaultDeserilizer); } template std::error_code construct(KT&& key, PTs&&... params) requires mcc::traits::mcc_output_char_range { return construct(_defaultSerializer, std::forward(key), std::forward(params)...); } }; class Asibfm700MountNetServer : public mcc::network::MccGenericNetworkServer { using _base_t = mcc::network::MccGenericNetworkServer; public: template Asibfm700MountNetServer(asio::io_context& ctx, std::shared_ptr logger, const R& pattern_range = Asibfm700Logger::LOGGER_DEFAULT_FORMAT); ~Asibfm700MountNetServer(); private: std::vector handleMessage(std::string_view msg); }; } // namespace asibfm700