//----------------------------------------------------------------------------- // ___ __ _ _ // / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __ // / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ / // / ___/ (_| | | \__ \ __/ /__| | | | | < // \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ . // //----------------------------------------------------------------------------- // Author: Kurt Sassenrath // Module: Message // // Message types. // // Copyright (c) 2023 Kurt Sassenrath. // // License TBD. //----------------------------------------------------------------------------- #ifndef message_0c61530748b9f966 #define message_0c61530748b9f966 #include #include #include namespace parselink { namespace message { enum class error { bad_magic, // Did not get the message magic expected too_large, // The message size was too large. unknown_type, // The message type is not known }; // Parselink messages are encoded with MessagePack and take the form of: // | magic | size | content | // - [magic] is the string "prs", in "fixstr" format. // - [size] is the size of the message, not including this header. // - [content] is [size] bytes of MessagePack data, including the // specific type of message presented. // This class is responsible for consuming buffer data and yielding a message // instance when complete. Will throw an error if data is incorrect. // class builder { public: // For now, builders don't manage any buffers themselves. Later, that // may change. builder() = default; // Reset the builder to its initial state. This means any partially-decoded // message data will be lost. void reset() noexcept; // How many bytes are needed to perform a meaningful amount of work. std::size_t bytes_needed() noexcept; // Process data from a buffer, building messages. Returns the number of // bytes read from the buffer for the caller's bookkeeping. May yield a // message in addition. std::size_t process(std::span buffer) noexcept; private: enum class state { magic, size, payload }; state state_{state::magic}; std::size_t payload_size_{}; std::size_t payload_remaining_{}; }; } // namespace message } // namespace parselink #endif // message_0c61530748b9f966