in squangle/mysql_client/Query.cpp [182:217]
void QueryArgument::initFromDynamic(const folly::dynamic& param) {
// Convert to basic values and get type
if (param.isObject()) {
// List of pairs
std::vector<folly::dynamic> keys(param.keys().begin(), param.keys().end());
std::sort(keys.begin(), keys.end());
value_ = std::vector<ArgPair>();
auto& vec = boost::get<std::vector<ArgPair>>(value_);
vec.reserve(keys.size());
for (const auto& key : keys) {
QueryArgument q2(fromDynamic(param[key]));
vec.emplace_back(ArgPair(key.asString(), q2));
}
} else if (param.isNull()) {
value_ = nullptr;
} else if (param.isArray()) {
value_ = std::vector<QueryArgument>();
boost::get<std::vector<QueryArgument>>(value_).reserve(param.size());
auto& v = boost::get<std::vector<QueryArgument>>(value_);
for (const auto& val : param) {
v.emplace_back(fromDynamic(val));
}
} else if (param.isString()) {
value_ = folly::fbstring(param.getString());
} else if (param.isBool()) {
value_ = param.asBool();
} else if (param.isDouble()) {
value_ = param.asDouble();
} else if (param.isInt()) {
value_ = param.asInt();
} else {
throw std::invalid_argument("Dynamic type doesn't match to accepted ones");
}
}