Boost::urls::format

Boost 1.82 dropped a lovely new toy, boost::urls::format, which is a lot
like our urlFromPieces method, but better in that it makes the resulting
uris more readable, and allows doing things like fragments in a single
line instead of multiple.  We should prefer it in some cases.

Tested:
Redfish service validator passes.
Spot checks of URLs work as expected.
Unit tests pass.

Signed-off-by: Ed Tanous <edtanous@google.com>
Change-Id: Ia7b38f0a95771c862507e7d5b4aa68aa1c98403c
diff --git a/redfish-core/lib/virtual_media.hpp b/redfish-core/lib/virtual_media.hpp
index 373881e..8192da2 100644
--- a/redfish-core/lib/virtual_media.hpp
+++ b/redfish-core/lib/virtual_media.hpp
@@ -25,6 +25,7 @@
 #include "utils/json_utils.hpp"
 
 #include <boost/process/async_pipe.hpp>
+#include <boost/url/format.hpp>
 #include <boost/url/url_view.hpp>
 
 #include <array>
@@ -245,8 +246,8 @@
                                      const std::string& resName)
 {
     nlohmann::json item;
-    item["@odata.id"] = crow::utility::urlFromPieces(
-        "redfish", "v1", "Managers", name, "VirtualMedia", resName);
+    item["@odata.id"] = boost::urls::format(
+        "/redfish/v1/Managers/{}/VirtualMedia/{}", name, resName);
 
     item["@odata.type"] = "#VirtualMedia.v1_3_0.VirtualMedia";
     item["Name"] = "Virtual Removable Media";
@@ -290,8 +291,8 @@
                 continue;
             }
 
-            item["@odata.id"] = crow::utility::urlFromPieces(
-                "redfish", "v1", "Managers", name, "VirtualMedia", path);
+            item["@odata.id"] = boost::urls::format(
+                "/redfish/v1/Managers/{}/VirtualMedia/{}", name, path);
             members.emplace_back(std::move(item));
         }
         aResp->res.jsonValue["Members@odata.count"] = members.size();
@@ -318,19 +319,18 @@
     // Check if dbus path is Legacy type
     if (mode == VmMode::Legacy)
     {
-        asyncResp->res
-            .jsonValue["Actions"]["#VirtualMedia.InsertMedia"]["target"] =
-            crow::utility::urlFromPieces("redfish", "v1", "Managers", name,
-                                         "VirtualMedia", resName, "Actions",
-                                         "VirtualMedia.InsertMedia");
+        asyncResp->res.jsonValue["Actions"]["#VirtualMedia.InsertMedia"]
+                                ["target"] = boost::urls::format(
+            "/redfish/v1/Managers/{}/VirtualMedia/{}/Actions/VirtualMedia.InsertMedia",
+            name, resName);
     }
 
     vmParseInterfaceObject(item.second, asyncResp);
 
-    asyncResp->res.jsonValue["Actions"]["#VirtualMedia.EjectMedia"]["target"] =
-        crow::utility::urlFromPieces("redfish", "v1", "Managers", name,
-                                     "VirtualMedia", resName, "Actions",
-                                     "VirtualMedia.EjectMedia");
+    asyncResp->res.jsonValue["Actions"]["#VirtualMedia.EjectMedia"]
+                            ["target"] = boost::urls::format(
+        "/redfish/v1/Managers/{}/VirtualMedia/{}/Actions/VirtualMedia.EjectMedia",
+        name, resName);
 }
 
 /**
@@ -986,8 +986,8 @@
     asyncResp->res.jsonValue["@odata.type"] =
         "#VirtualMediaCollection.VirtualMediaCollection";
     asyncResp->res.jsonValue["Name"] = "Virtual Media Services";
-    asyncResp->res.jsonValue["@odata.id"] = crow::utility::urlFromPieces(
-        "redfish", "v1", "Managers", name, "VirtualMedia");
+    asyncResp->res.jsonValue["@odata.id"] =
+        boost::urls::format("/redfish/v1/Managers/{}/VirtualMedia", name);
 
     dbus::utility::getDbusObject(
         "/xyz/openbmc_project/VirtualMedia", {},