17 if (o.type != msgpack::type::MAP) {
22 for (uint32_t i = 0; i < o.via.map.size; ++i) {
23 if (o.via.map.ptr[i].key.type != msgpack::type::STR) {
27 kvmap.emplace(std::string(o.via.map.ptr[i].key.via.str.ptr, o.via.map.ptr[i].key.via.str.size),
28 &o.via.map.ptr[i].val);
35 std::string
const& struct_name,
36 std::string
const& field_name,
40 auto it = kvmap.find(field_name);
41 if (it != kvmap.end()) {
42 if (!is_optional && it->second->type == msgpack::type::NIL) {
43 throw_or_abort(
"nil value for required field: " + struct_name +
"::" + field_name);
46 it->second->convert(field);
47 }
catch (
const msgpack::type_error&) {
49 throw_or_abort(
"error converting into field " + struct_name +
"::" + field_name);
51 }
else if (!is_optional) {
52 throw_or_abort(
"missing field: " + struct_name +
"::" + field_name);
58 std::string
const& struct_name,
59 std::string
const& field_name,
63 if (
index >= array.size) {
66 auto element = array.ptr[
index];
67 if (element.type == msgpack::type::NIL) {
68 throw_or_abort(
"nil value for required field: " + struct_name +
"::" + field_name);
71 element.convert(field);
72 }
catch (
const msgpack::type_error&) {
74 throw_or_abort(
"error converting into field " + struct_name +
"::" + field_name);
83 std::string
const& struct_name,
84 std::string
const& field_name,
89 }
catch (
const msgpack::type_error&) {
91 throw_or_abort(
"error converting into field " + struct_name +
"::" + field_name);
102 return o.type == msgpack::type::MAP && o.via.map.size > 0 &&
103 o.via.map.ptr[0].key.type == msgpack::type::POSITIVE_INTEGER;
112 template <
typename Dispatch>
113 static void int_map_dispatch(msgpack::object
const& o, std::string
const& name, Dispatch&& dispatch)
115 for (uint32_t i = 0; i < o.via.map.size; ++i) {
118 o.via.map.ptr[i].key.convert(
tag);
119 }
catch (
const msgpack::type_error&) {
123 dispatch(
tag, o.via.map.ptr[i].val);
138 static void check_size(uint32_t actual, std::string
const& name, uint32_t active, uint32_t reserved)
140 uint32_t max_size = active + reserved;
141 if (actual > max_size) {
145 " reserved); opt into `#[tagged(allow_unknown_tags)]` on the Rust type to accept extras");
165 }
catch (
const msgpack::type_error&) {
183 }
catch (
const msgpack::type_error&) {
198 packer.pack_array(2);
205 std::string name =
"StackItem";
206 if (o.type == msgpack::type::MAP) {
227 }
else if (o.type == msgpack::type::ARRAY) {
228 auto array = o.via.array;
239 std::vector<Witnesses::StackItem>
stack;
245 packer.pack_array(1);
251 std::string name =
"WitnessStack";
252 if (o.type == msgpack::type::MAP) {
269 }
else if (o.type == msgpack::type::ARRAY) {
270 auto array = o.via.array;
285 if (!(lhs.
index == rhs.index)) {
288 if (!(lhs.
witness == rhs.witness)) {
297template <
typename Serializer>
300 serializer.increase_container_depth();
303 serializer.decrease_container_depth();
307template <
typename Deserializer>
310 deserializer.increase_container_depth();
314 deserializer.decrease_container_depth();
322 if (!(lhs.
value == rhs.value)) {
331template <
typename Serializer>
334 serializer.increase_container_depth();
336 serializer.decrease_container_depth();
340template <
typename Deserializer>
343 deserializer.increase_container_depth();
346 deserializer.decrease_container_depth();
354 if (!(lhs.
value == rhs.value)) {
363template <
typename Serializer>
366 serializer.increase_container_depth();
368 serializer.decrease_container_depth();
372template <
typename Deserializer>
375 deserializer.increase_container_depth();
378 deserializer.decrease_container_depth();
386 if (!(lhs.
stack == rhs.stack)) {
395template <
typename Serializer>
398 serializer.increase_container_depth();
400 serializer.decrease_container_depth();
404template <
typename Deserializer>
407 deserializer.increase_container_depth();
410 deserializer.decrease_container_depth();
bool operator==(const StackItem &lhs, const StackItem &rhs)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
static std::map< std::string, msgpack::object const * > make_kvmap(msgpack::object const &o, std::string const &name)
static void check_size(uint32_t actual, std::string const &name, uint32_t active, uint32_t reserved)
static bool is_int_keyed_map(msgpack::object const &o)
static void conv_fld_from_array(msgpack::object_array const &array, std::string const &struct_name, std::string const &field_name, T &field, uint32_t index)
static void convert_or_throw(msgpack::object const &val, std::string const &struct_name, std::string const &field_name, T &field)
static void int_map_dispatch(msgpack::object const &o, std::string const &name, Dispatch &&dispatch)
static void conv_fld_from_kvmap(std::map< std::string, msgpack::object const * > const &kvmap, std::string const &struct_name, std::string const &field_name, T &field, bool is_optional)
void msgpack_pack(auto &packer) const
friend bool operator==(const StackItem &, const StackItem &)
Witnesses::WitnessMap witness
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
bool operator<(Witness const &rhs) const
friend bool operator==(const Witness &, const Witness &)
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
friend bool operator==(const WitnessMap &, const WitnessMap &)
std::map< Witnesses::Witness, std::vector< uint8_t > > value
void msgpack_unpack(msgpack::object const &o)
void msgpack_pack(auto &packer) const
std::vector< Witnesses::StackItem > stack
friend bool operator==(const WitnessStack &, const WitnessStack &)
void msgpack_unpack(msgpack::object const &o)
static T deserialize(Deserializer &deserializer)
static void serialize(const T &value, Serializer &serializer)
void throw_or_abort(std::string const &err)