31 auto* original_cout_buf =
std::cout.rdbuf();
35 std::ostream stdout_stream(original_cout_buf);
38 while (!input_stream.eof()) {
41 input_stream.read(
reinterpret_cast<char*
>(&
length),
sizeof(
length));
43 if (input_stream.gcount() !=
sizeof(
length)) {
60 auto unpacked = msgpack::unpack(
reinterpret_cast<const char*
>(
buffer.data()),
buffer.size());
61 auto obj = unpacked.get();
64 if (obj.type != msgpack::type::ARRAY || obj.via.array.size != 2) {
65 throw_or_abort(
"Expected an array of size 2 [command-name, payload] for bbapi command deserialization");
68 auto& arr = obj.via.array;
69 if (arr.ptr[0].type != msgpack::type::STR) {
70 throw_or_abort(
"Expected first element to be a string (type name) in bbapi command deserialization");
81 msgpack::sbuffer response_buffer;
82 msgpack::pack(response_buffer, response);
85 uint32_t response_length =
static_cast<uint32_t
>(response_buffer.size());
86 stdout_stream.write(
reinterpret_cast<const char*
>(&response_length),
sizeof(response_length));
87 stdout_stream.write(response_buffer.data(),
static_cast<std::streamsize>(response_buffer.size()));
88 stdout_stream.flush();
108 std::istream* input_stream = &
std::cin;
109 std::ifstream file_stream;
111 if (!msgpack_input_file.empty()) {
112 file_stream.open(msgpack_input_file, std::ios::binary);
113 if (!file_stream.is_open()) {
117 input_stream = &file_stream;