@use crate::data::RPC; @use crate::generators::cpp_s::*; @(rpc: &RPC) template void json_get(const rapidjson::Value &j, const char *key, T &v); template void json_get_inner(const rapidjson::Value&, T &v) = delete; template<> inline void json_get_inner(const rapidjson::Value &member, std::string &v) @{ if (!member.IsString()) throw std::exception@{@}; v = member.GetString(); @} @for i in [8, 16, 32] { template<> inline void json_get_inner(const rapidjson::Value &member, std::int@(i)_t &v) @{ if (!member.IsInt()) throw std::exception@{@}; v = member.GetInt(); @} template<> inline void json_get_inner(const rapidjson::Value &member, std::uint@(i)_t& v) @{ if (!member.IsUint()) throw std::exception@{@}; v = member.GetUint(); @} } template<> inline void json_get_inner(const rapidjson::Value &member, std::int64_t &v) @{ if (!member.IsInt64()) throw std::exception@{@}; v = member.GetInt64(); @} template<> inline void json_get_inner(const rapidjson::Value &member, std::uint64_t& v) @{ if (!member.IsUint64()) throw std::exception@{@}; v = member.GetUint64(); @} template<> inline void json_get_inner(const rapidjson::Value &member, bool &v) @{ if (!member.IsBool()) throw std::exception@{@}; v = member.GetBool(); @} template<> inline void json_get_inner(const rapidjson::Value &member, double &v) @{ if (!member.IsDouble()) throw std::exception@{@}; v = member.GetDouble(); @} template inline void json_get_inner(const rapidjson::Value &member, std::optional &v) @{ if (member.IsNull()) v = std::nullopt; else @{ T t; json_get_inner(member, t); v = std::move(t); @} @} template inline void json_get_inner(const rapidjson::Value &member, std::vector &v) @{ if (!member.IsArray()) throw std::exception@{@}; for (const auto &j : member.GetArray()) @{ T t; json_get_inner(j, t); v.push_back(std::move(t)); @} @} @for s in &rpc.structs { template<> inline void json_get_inner(const rapidjson::Value &__j, mrpc::@s.name &v) @{ using namespace mrpc; @for f in &s.fields { json_get<@ty_to_str(&f.ty)>(__j, "@f.name", v.@f.name); }@} } @for e in &rpc.enums { template<> inline void json_get_inner(const rapidjson::Value &j, mrpc::@e.name &v) @{ json_get_inner(j, (std::uint64_t&)v); @} mrpc::MRPCJWriter& operator >>(const mrpc::@e.name &v, mrpc::MRPCJWriter &w) @{ w.Uint64((std::uint64_t)v); return w; @} } template inline void json_get(const rapidjson::Value &j, const char *key, T &v) @{ auto member = j.FindMember(key); if (member == j.MemberEnd()) throw std::exception@{@}; json_get_inner(member->value, v); @} namespace mrpc @{ @for s in &rpc.structs { MRPCJWriter& @(s.name)::operator >>(MRPCJWriter &__w) const @{ __w.StartObject(); @for f in &s.fields { __w.Key("@f.name"); @json_write(&f) } __w.EndObject(); return __w; @} @(s.name)& @(s.name)::operator <<(const rapidjson::Value &__j) @{ json_get_inner<@(s.name)>(__j, *this); return *this; @} }