parselink-old/include/parselink/proto/message.h
Kurt Sassenrath 2a4c819f4f Fix approach to include paths.
This accommodates bazel's best practices a bit better.
2023-10-04 21:23:36 -07:00

79 lines
2.4 KiB
C++

//-----------------------------------------------------------------------------
// ___ __ _ _
// / _ \__ _ _ __ ___ ___ / /(_)_ __ | | __
// / /_)/ _` | '__/ __|/ _ \/ / | | '_ \| |/ /
// / ___/ (_| | | \__ \ __/ /__| | | | | <
// \/ \__,_|_| |___/\___\____/_|_| |_|_|\_\ .
//
//-----------------------------------------------------------------------------
// Author: Kurt Sassenrath
// Module: Message
//
// Message types.
//
// Copyright (c) 2023 Kurt Sassenrath.
//
// License TBD.
//-----------------------------------------------------------------------------
#ifndef message_0c61530748b9f966
#define message_0c61530748b9f966
#include <span>
#include <cstdint>
#include <tl/expected.hpp>
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<std::byte const> 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