12#if CONTAINER_HAS_RESULT
18 std::vector<uint8_t> serialize_container_to_msgpack(
const value_container& container);
20 void write_value_to_encoder(msgpack_encoder& encoder,
const optimized_value& unit)
24 case value_types::null_value:
28 case value_types::bool_value:
29 encoder.write_bool(std::get<bool>(unit.data));
32 case value_types::short_value:
33 encoder.write_int(std::get<short>(unit.data));
36 case value_types::ushort_value:
37 encoder.write_uint(std::get<unsigned short>(unit.data));
40 case value_types::int_value:
41 encoder.write_int(std::get<int>(unit.data));
44 case value_types::uint_value:
45 encoder.write_uint(std::get<unsigned int>(unit.data));
48 case value_types::long_value:
49 encoder.write_int(std::get<long>(unit.data));
52 case value_types::ulong_value:
53 encoder.write_uint(std::get<unsigned long>(unit.data));
56 case value_types::llong_value:
57 encoder.write_int(std::get<long long>(unit.data));
60 case value_types::ullong_value:
61 encoder.write_uint(std::get<unsigned long long>(unit.data));
64 case value_types::float_value:
65 encoder.write_float(std::get<float>(unit.data));
68 case value_types::double_value:
69 encoder.write_double(std::get<double>(unit.data));
72 case value_types::string_value:
73 encoder.write_string(std::get<std::string>(unit.data));
76 case value_types::bytes_value:
77 encoder.write_binary(std::get<std::vector<uint8_t>>(unit.data));
80 case value_types::container_value:
83 auto nested = std::get<std::shared_ptr<value_container>>(unit.data);
86 auto nested_data = serialize_container_to_msgpack(*nested);
87 encoder.write_binary(nested_data);
96 case value_types::array_value:
98 auto arr = std::get<std::shared_ptr<array_values>>(unit.data);
99 if (arr && !arr->items.empty())
101 encoder.write_array_header(
static_cast<uint32_t
>(arr->items.size()));
102 for (
const auto& item : arr->items)
105 optimized_value temp;
107 temp.type =
static_cast<value_types
>(item.index());
108 write_value_to_encoder(encoder, temp);
113 encoder.write_array_header(0);
124 std::vector<uint8_t> serialize_container_to_msgpack(
const value_container& container)
127 auto message_type = container.message_type();
128 auto target_id = container.target_id();
129 auto target_sub_id = container.target_sub_id();
130 auto source_id = container.source_id();
131 auto source_sub_id = container.source_sub_id();
132 auto version = container.version();
133 auto values = container.get_variant_values();
135 msgpack_encoder encoder;
138 encoder.reserve(200 + values.size() * 32);
147 encoder.write_map_header(2);
150 encoder.write_string(
"header");
153 size_t header_count = 2;
154 if (message_type !=
"data_container")
160 encoder.write_map_header(header_count);
162 if (message_type !=
"data_container")
164 encoder.write_string(
"target_id");
165 encoder.write_string(target_id);
167 encoder.write_string(
"target_sub_id");
168 encoder.write_string(target_sub_id);
170 encoder.write_string(
"source_id");
171 encoder.write_string(source_id);
173 encoder.write_string(
"source_sub_id");
174 encoder.write_string(source_sub_id);
177 encoder.write_string(
"message_type");
178 encoder.write_string(message_type);
180 encoder.write_string(
"version");
181 encoder.write_string(version);
184 encoder.write_string(
"values");
187 encoder.write_map_header(values.size());
189 for (
const auto& unit : values)
192 encoder.write_string(unit.name);
195 write_value_to_encoder(encoder, unit);
198 return encoder.finish();
202kcenon::common::Result<std::vector<uint8_t>>
203msgpack_serializer::serialize(
const value_container& container)
const noexcept
207 auto data = serialize_container_to_msgpack(container);
208 return kcenon::common::ok(std::move(data));
210 catch (
const std::bad_alloc&)
212 return kcenon::common::Result<std::vector<uint8_t>>(
213 kcenon::common::error_info{
215 "Memory allocation failed during MessagePack serialization",
216 "msgpack_serializer"});
218 catch (
const std::exception& e)
220 return kcenon::common::Result<std::vector<uint8_t>>(
221 kcenon::common::error_info{
223 std::string(
"MessagePack serialization failed: ") + e.what(),
224 "msgpack_serializer"});