#pragma once #include #include #include #include "wire.h" using handler_fn = size_t (*)(uint32_t message_id, std::span payload, span_writer &out); struct handler_entry { int8_t type_id; handler_fn handle; }; template size_t typed_handler(uint32_t message_id, std::span payload, span_writer &out) { msgpack::parser p(payload.data(), static_cast(payload.size())); Req req; auto tup = req.as_tuple(); auto r = msgpack::unpack(p, tup); if (!r) { return encode_response_into(out, message_id, DeviceError{1, "decode request ext_id=" + std::to_string(Req::ext_id) + ": msgpack error " + std::to_string(static_cast(r.error()))}); } return Fn(message_id, req, out); } void dispatch_init(); void dispatch_schedule_ms(uint32_t ms, std::function fn); [[noreturn]] void dispatch_run(std::span handlers);