Remove brace initialization of json objects
Brace initialization of json objects, while quite interesting from an
academic sense, are very difficult for people to grok, and lead to
inconsistencies. This patchset aims to remove a majority of them in
lieu of operator[]. Interestingly, this saves about 1% of the binary
size of bmcweb.
This also has an added benefit that as a design pattern, we're never
constructing a new object, then moving it into place, we're always
adding to the existing object, which in the future _could_ make things
like OEM schemas or properties easier, as there's no case where we're
completely replacing the response object.
Tested:
Ran redfish service validator. No new failures.
Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: Iae409b0a40ddd3ae6112cb2d52c6f6ab388595fe
diff --git a/include/dbus_monitor.hpp b/include/dbus_monitor.hpp
index 764d157..977f3a3 100644
--- a/include/dbus_monitor.hpp
+++ b/include/dbus_monitor.hpp
@@ -45,8 +45,9 @@
return 0;
}
sdbusplus::message::message message(m);
- nlohmann::json j{{"event", message.get_member()},
- {"path", message.get_path()}};
+ nlohmann::json json;
+ json["event"] = message.get_member();
+ json["path"] = message.get_path();
if (strcmp(message.get_member(), "PropertiesChanged") == 0)
{
nlohmann::json data;
@@ -63,8 +64,8 @@
}
// data is type sa{sv}as and is an array[3] of string, object, array
- j["interface"] = data[0];
- j["properties"] = data[1];
+ json["interface"] = data[0];
+ json["properties"] = data[1];
}
else if (strcmp(message.get_member(), "InterfacesAdded") == 0)
{
@@ -88,7 +89,7 @@
auto it = thisSession->second.interfaces.find(entry.key());
if (it != thisSession->second.interfaces.end())
{
- j["interfaces"][entry.key()] = entry.value();
+ json["interfaces"][entry.key()] = entry.value();
}
}
}
@@ -100,7 +101,7 @@
}
connection->sendText(
- j.dump(2, ' ', true, nlohmann::json::error_handler_t::replace));
+ json.dump(2, ' ', true, nlohmann::json::error_handler_t::replace));
return 0;
}
diff --git a/include/ibm/management_console_rest.hpp b/include/ibm/management_console_rest.hpp
index 8e30746..0fbd2e2 100644
--- a/include/ibm/management_console_rest.hpp
+++ b/include/ibm/management_console_rest.hpp
@@ -690,12 +690,12 @@
asyncResp->res.jsonValue["@odata.id"] = "/ibm/v1/";
asyncResp->res.jsonValue["Id"] = "IBM Rest RootService";
asyncResp->res.jsonValue["Name"] = "IBM Service Root";
- asyncResp->res.jsonValue["ConfigFiles"] = {
- {"@odata.id", "/ibm/v1/Host/ConfigFiles"}};
- asyncResp->res.jsonValue["LockService"] = {
- {"@odata.id", "/ibm/v1/HMC/LockService"}};
- asyncResp->res.jsonValue["BroadcastService"] = {
- {"@odata.id", "/ibm/v1/HMC/BroadcastService"}};
+ asyncResp->res.jsonValue["ConfigFiles"]["@odata.id"] =
+ "/ibm/v1/Host/ConfigFiles";
+ asyncResp->res.jsonValue["LockService"]["@odata.id"] =
+ "/ibm/v1/HMC/LockService";
+ asyncResp->res.jsonValue["BroadcastService"]["@odata.id"] =
+ "/ibm/v1/HMC/BroadcastService";
});
BMCWEB_ROUTE(app, "/ibm/v1/Host/ConfigFiles")
diff --git a/include/image_upload.hpp b/include/image_upload.hpp
index 330ea9c..aefb27e 100644
--- a/include/image_upload.hpp
+++ b/include/image_upload.hpp
@@ -51,12 +51,10 @@
}
asyncResp->res.result(boost::beast::http::status::bad_request);
- asyncResp->res.jsonValue = {
- {"data",
- {{"description",
- "Version already exists or failed to be extracted"}}},
- {"message", "400 Bad Request"},
- {"status", "error"}};
+ asyncResp->res.jsonValue["data"]["description"] =
+ "Version already exists or failed to be extracted";
+ asyncResp->res.jsonValue["message"] = "400 Bad Request";
+ asyncResp->res.jsonValue["status"] = "error";
};
std::function<void(sdbusplus::message::message&)> callback =
@@ -80,8 +78,9 @@
leaf = path.str;
}
- asyncResp->res.jsonValue = {
- {"data", leaf}, {"message", "200 OK"}, {"status", "ok"}};
+ asyncResp->res.jsonValue["data"] = leaf;
+ asyncResp->res.jsonValue["message"] = "200 OK";
+ asyncResp->res.jsonValue["status"] = "ok";
BMCWEB_LOG_DEBUG << "ending response";
fwUpdateMatcher = nullptr;
}
diff --git a/include/login_routes.hpp b/include/login_routes.hpp
index abcdaee..a4fa9b7 100644
--- a/include/login_routes.hpp
+++ b/include/login_routes.hpp
@@ -199,11 +199,11 @@
// structure, and doesn't actually look at the status
// code.
// TODO(ed).... Fix that upstream
- asyncResp->res.jsonValue = {
- {"data",
- "User '" + std::string(username) + "' logged in"},
- {"message", "200 OK"},
- {"status", "ok"}};
+
+ asyncResp->res.jsonValue["data"] =
+ "User '" + std::string(username) + "' logged in";
+ asyncResp->res.jsonValue["message"] = "200 OK";
+ asyncResp->res.jsonValue["status"] = "ok";
// Hack alert. Boost beast by default doesn't let you
// declare multiple headers of the same name, and in
@@ -226,8 +226,8 @@
else
{
// if content type is json, assume json token
- asyncResp->res.jsonValue = {
- {"token", session->sessionToken}};
+ asyncResp->res.jsonValue["token"] =
+ session->sessionToken;
}
}
}
@@ -245,10 +245,10 @@
const auto& session = req.session;
if (session != nullptr)
{
- asyncResp->res.jsonValue = {
- {"data", "User '" + session->username + "' logged out"},
- {"message", "200 OK"},
- {"status", "ok"}};
+ asyncResp->res.jsonValue["data"] =
+ "User '" + session->username + "' logged out";
+ asyncResp->res.jsonValue["message"] = "200 OK";
+ asyncResp->res.jsonValue["status"] = "ok";
persistent_data::SessionStore::getInstance().removeSession(
session);
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 4f4bd71..75e31f1 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -57,9 +57,9 @@
const std::string_view msg)
{
res.result(result);
- res.jsonValue = {{"data", {{"description", desc}}},
- {"message", msg},
- {"status", "error"}};
+ res.jsonValue["data"]["description"] = desc;
+ res.jsonValue["message"] = msg;
+ res.jsonValue["status"] = "error";
}
inline void
@@ -69,9 +69,9 @@
{
if (transaction->res.jsonValue.is_null())
{
- transaction->res.jsonValue = {{"status", "ok"},
- {"bus_name", processName},
- {"objects", nlohmann::json::array()}};
+ transaction->res.jsonValue["status"] = "ok";
+ transaction->res.jsonValue["bus_name"] = processName;
+ transaction->res.jsonValue["objects"] = nlohmann::json::array();
}
crow::connections::systemBus->async_method_call(
@@ -87,8 +87,10 @@
<< "\n";
return;
}
- transaction->res.jsonValue["objects"].push_back(
- {{"path", objectPath}});
+ nlohmann::json::object_t object;
+ object["path"] = objectPath;
+
+ transaction->res.jsonValue["objects"].push_back(std::move(object));
tinyxml2::XMLDocument doc;
@@ -468,9 +470,9 @@
}
else
{
- res.jsonValue = {{"status", "ok"},
- {"message", "200 OK"},
- {"data", methodResponse}};
+ res.jsonValue["status"] = "ok";
+ res.jsonValue["message"] = "200 OK";
+ res.jsonValue["data"] = methodResponse;
}
}
}
@@ -1626,9 +1628,9 @@
}
else
{
- asyncResp->res.jsonValue = {{"status", "ok"},
- {"message", "200 OK"},
- {"data", objectPaths}};
+ asyncResp->res.jsonValue["status"] = "ok";
+ asyncResp->res.jsonValue["message"] = "200 OK";
+ asyncResp->res.jsonValue["data"] = objectPaths;
}
},
"xyz.openbmc_project.ObjectMapper",
@@ -1642,9 +1644,9 @@
{
BMCWEB_LOG_DEBUG << "Doing enumerate on " << objectPath;
- asyncResp->res.jsonValue = {{"message", "200 OK"},
- {"status", "ok"},
- {"data", nlohmann::json::object()}};
+ asyncResp->res.jsonValue["message"] = "200 OK";
+ asyncResp->res.jsonValue["status"] = "ok";
+ asyncResp->res.jsonValue["data"] = nlohmann::json::object();
crow::connections::systemBus->async_method_call(
[objectPath, asyncResp](
@@ -1773,10 +1775,11 @@
}
else
{
- asyncResp->res.jsonValue = {
- {"status", "ok"},
- {"message", "200 OK"},
- {"data", *response}};
+ asyncResp->res.jsonValue["status"] = "ok";
+ asyncResp->res.jsonValue["message"] =
+ "200 OK";
+ asyncResp->res.jsonValue["data"] =
+ *response;
}
}
});
@@ -2000,11 +2003,17 @@
else
{
transaction->asyncResp
- ->res.jsonValue = {
- {"status", "ok"},
- {"message",
- "200 OK"},
- {"data", nullptr}};
+ ->res.jsonValue
+ ["status"] =
+ "ok";
+ transaction->asyncResp
+ ->res.jsonValue
+ ["message"] =
+ "200 OK";
+ transaction->asyncResp
+ ->res
+ .jsonValue["data"] =
+ nullptr;
}
});
}
@@ -2178,16 +2187,17 @@
BMCWEB_LOG_ERROR << "XML document failed to parse "
<< processName << " " << objectPath
<< "\n";
- asyncResp->res.jsonValue = {{"status", "XML parse error"}};
+ asyncResp->res.jsonValue["status"] = "XML parse error";
asyncResp->res.result(
boost::beast::http::status::internal_server_error);
return;
}
BMCWEB_LOG_DEBUG << introspectXml;
- asyncResp->res.jsonValue = {{"status", "ok"},
- {"bus_name", processName},
- {"object_path", objectPath}};
+ asyncResp->res.jsonValue["status"] = "ok";
+ asyncResp->res.jsonValue["bus_name"] = processName;
+ asyncResp->res.jsonValue["object_path"] = objectPath;
+
nlohmann::json& interfacesArray =
asyncResp->res.jsonValue["interfaces"];
interfacesArray = nlohmann::json::array();
@@ -2199,7 +2209,9 @@
const char* ifaceName = interface->Attribute("name");
if (ifaceName != nullptr)
{
- interfacesArray.push_back({{"name", ifaceName}});
+ nlohmann::json::object_t interface;
+ interface["name"] = ifaceName;
+ interfacesArray.push_back(std::move(interface));
}
interface = interface->NextSiblingElement("interface");
@@ -2235,10 +2247,11 @@
boost::beast::http::status::internal_server_error);
return;
}
- asyncResp->res.jsonValue = {{"status", "ok"},
- {"bus_name", processName},
- {"interface", interfaceName},
- {"object_path", objectPath}};
+
+ asyncResp->res.jsonValue["status"] = "ok";
+ asyncResp->res.jsonValue["bus_name"] = processName;
+ asyncResp->res.jsonValue["interface"] = interfaceName;
+ asyncResp->res.jsonValue["object_path"] = objectPath;
nlohmann::json& methodsArray =
asyncResp->res.jsonValue["methods"];
@@ -2313,9 +2326,13 @@
uri += interfaceName;
uri += "/";
uri += name;
- methodsArray.push_back({{"name", name},
- {"uri", std::move(uri)},
- {"args", argsArray}});
+
+ nlohmann::json::object_t object;
+ object["name"] = name;
+ object["uri"] = std::move(uri);
+ object["args"] = argsArray;
+
+ methodsArray.push_back(std::move(object));
}
methods = methods->NextSiblingElement("method");
}
@@ -2343,8 +2360,10 @@
const char* name = signals->Attribute("name");
if (name != nullptr)
{
- signalsArray.push_back(
- {{"name", name}, {"args", argsArray}});
+ nlohmann::json::object_t object;
+ object["name"] = name;
+ object["args"] = argsArray;
+ signalsArray.push_back(std::move(object));
}
signals = signals->NextSiblingElement("signal");
@@ -2424,8 +2443,11 @@
.methods(boost::beast::http::verb::get)(
[](const crow::Request&,
const std::shared_ptr<bmcweb::AsyncResp>& asyncResp) {
- asyncResp->res.jsonValue = {{"buses", {{{"name", "system"}}}},
- {"status", "ok"}};
+ nlohmann::json::array_t buses;
+ nlohmann::json& bus = buses.emplace_back();
+ bus["name"] = "system";
+ asyncResp->res.jsonValue["busses"] = std::move(buses);
+ asyncResp->res.jsonValue["status"] = "ok";
});
BMCWEB_ROUTE(app, "/bus/system/")
@@ -2445,11 +2467,13 @@
else
{
std::sort(names.begin(), names.end());
- asyncResp->res.jsonValue = {{"status", "ok"}};
+ asyncResp->res.jsonValue["status"] = "ok";
auto& objectsSub = asyncResp->res.jsonValue["objects"];
for (auto& name : names)
{
- objectsSub.push_back({{"name", name}});
+ nlohmann::json::object_t object;
+ object["name"] = name;
+ objectsSub.push_back(std::move(object));
}
}
};
diff --git a/include/persistent_data.hpp b/include/persistent_data.hpp
index 6d0f7c1..1ca925e 100644
--- a/include/persistent_data.hpp
+++ b/include/persistent_data.hpp
@@ -207,25 +207,25 @@
const auto& c = SessionStore::getInstance().getAuthMethodsConfig();
const auto& eventServiceConfig =
EventServiceStore::getInstance().getEventServiceConfig();
- nlohmann::json data{
- {"auth_config",
- {{"XToken", c.xtoken},
- {"Cookie", c.cookie},
- {"SessionToken", c.sessionToken},
- {"BasicAuth", c.basic},
- {"TLS", c.tls}}
+ nlohmann::json::object_t data;
+ nlohmann::json& authConfig = data["auth_config"];
- },
- {"eventservice_config",
- {{"ServiceEnabled", eventServiceConfig.enabled},
- {"DeliveryRetryAttempts", eventServiceConfig.retryAttempts},
- {"DeliveryRetryIntervalSeconds",
- eventServiceConfig.retryTimeoutInterval}}
+ authConfig["XToken"] = c.xtoken;
+ authConfig["Cookie"] = c.cookie;
+ authConfig["SessionToken"] = c.sessionToken;
+ authConfig["BasicAuth"] = c.basic;
+ authConfig["TLS"] = c.tls;
- },
- {"system_uuid", systemUuid},
- {"revision", jsonRevision},
- {"timeout", SessionStore::getInstance().getTimeoutInSeconds()}};
+ nlohmann::json& eventserviceConfig = data["eventservice_config"];
+ eventserviceConfig["ServiceEnabled"] = eventServiceConfig.enabled;
+ eventserviceConfig["DeliveryRetryAttempts"] =
+ eventServiceConfig.retryAttempts;
+ eventserviceConfig["DeliveryRetryIntervalSeconds"] =
+ eventServiceConfig.retryTimeoutInterval;
+
+ data["system_uuid"] = systemUuid;
+ data["revision"] = jsonRevision;
+ data["timeout"] = SessionStore::getInstance().getTimeoutInSeconds();
nlohmann::json& sessions = data["sessions"];
sessions = nlohmann::json::array();
@@ -234,16 +234,16 @@
if (p.second->persistence !=
persistent_data::PersistenceType::SINGLE_REQUEST)
{
- sessions.push_back({
- {"unique_id", p.second->uniqueId},
- {"session_token", p.second->sessionToken},
- {"username", p.second->username},
- {"csrf_token", p.second->csrfToken},
- {"client_ip", p.second->clientIp},
+ nlohmann::json::object_t session;
+ session["unique_id"] = p.second->uniqueId;
+ session["session_token"] = p.second->sessionToken;
+ session["username"] = p.second->username;
+ session["csrf_token"] = p.second->csrfToken;
+ session["client_ip"] = p.second->clientIp;
#ifdef BMCWEB_ENABLE_IBM_MANAGEMENT_CONSOLE
- {"client_id", p.second->clientId},
+ session["client_id"] = p.second->clientId;
#endif
- });
+ sessions.push_back(std::move(session));
}
}
nlohmann::json& subscriptions = data["subscriptions"];
@@ -270,20 +270,23 @@
headers[std::move(name)] = header.value();
}
- subscriptions.push_back({
- {"Id", subValue->id},
- {"Context", subValue->customText},
- {"DeliveryRetryPolicy", subValue->retryPolicy},
- {"Destination", subValue->destinationUrl},
- {"EventFormatType", subValue->eventFormatType},
- {"HttpHeaders", std::move(headers)},
- {"MessageIds", subValue->registryMsgIds},
- {"Protocol", subValue->protocol},
- {"RegistryPrefixes", subValue->registryPrefixes},
- {"ResourceTypes", subValue->resourceTypes},
- {"SubscriptionType", subValue->subscriptionType},
- {"MetricReportDefinitions", subValue->metricReportDefinitions},
- });
+ nlohmann::json::object_t subscription;
+
+ subscription["Id"] = subValue->id;
+ subscription["Context"] = subValue->customText;
+ subscription["DeliveryRetryPolicy"] = subValue->retryPolicy;
+ subscription["Destination"] = subValue->destinationUrl;
+ subscription["EventFormatType"] = subValue->eventFormatType;
+ subscription["HttpHeaders"] = std::move(headers);
+ subscription["MessageIds"] = subValue->registryMsgIds;
+ subscription["Protocol"] = subValue->protocol;
+ subscription["RegistryPrefixes"] = subValue->registryPrefixes;
+ subscription["ResourceTypes"] = subValue->resourceTypes;
+ subscription["SubscriptionType"] = subValue->subscriptionType;
+ subscription["MetricReportDefinitions"] =
+ subValue->metricReportDefinitions;
+
+ subscriptions.push_back(std::move(subscription));
}
persistentFile << data;
}