Break out formatters

In the change made to move to std::format, we defined some custom type
formatters in logging.hpp.  This had the unintended effect of making
all compile units pull in the majority of boost::url, and nlohmann::json
as includes.

This commit breaks out boost and json formatters into their own separate
includes.

Tested: Code compiles.  Logging changes only.

Change-Id: I6a788533169f10e19130a1910cd3be0cc729b020
Signed-off-by: Ed Tanous <ed@tanous.net>
diff --git a/http/complete_response_fields.hpp b/http/complete_response_fields.hpp
index 1ac75ad..bec33fc 100644
--- a/http/complete_response_fields.hpp
+++ b/http/complete_response_fields.hpp
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "authentication.hpp"
+#include "boost_formatters.hpp"
 #include "http_request.hpp"
 #include "http_response.hpp"
 #include "http_utility.hpp"
diff --git a/http/logging.hpp b/http/logging.hpp
index de14d99..9b1a36b 100644
--- a/http/logging.hpp
+++ b/http/logging.hpp
@@ -2,12 +2,6 @@
 
 #include "bmcweb_config.h"
 
-#include <boost/system/error_code.hpp>
-#include <boost/url/pct_string_view.hpp>
-#include <boost/url/string_view.hpp>
-#include <boost/url/url_view_base.hpp>
-#include <nlohmann/json.hpp>
-
 #include <bit>
 #include <format>
 #include <iostream>
@@ -15,64 +9,8 @@
 #include <string_view>
 #include <system_error>
 
-// Clang-tidy would rather these be static, but using static causes the template
-// specialization to not function.  Ignore the warning.
 // NOLINTBEGIN(readability-convert-member-functions-to-static, cert-dcl58-cpp)
 template <>
-struct std::formatter<boost::system::error_code>
-{
-    constexpr auto parse(std::format_parse_context& ctx)
-    {
-        return ctx.begin();
-    }
-
-    auto format(const boost::system::error_code& ec, auto& ctx) const
-    {
-        return std::format_to(ctx.out(), "{}", ec.what());
-    }
-};
-
-template <>
-struct std::formatter<boost::urls::pct_string_view>
-{
-    constexpr auto parse(std::format_parse_context& ctx)
-    {
-        return ctx.begin();
-    }
-    auto format(const boost::urls::pct_string_view& msg, auto& ctx) const
-    {
-        return std::format_to(ctx.out(), "{}",
-                              std::string_view(msg.data(), msg.size()));
-    }
-};
-
-template <std::derived_from<boost::urls::url_view_base> URL>
-struct std::formatter<URL>
-{
-    constexpr auto parse(std::format_parse_context& ctx)
-    {
-        return ctx.begin();
-    }
-    auto format(const URL& msg, auto& ctx) const
-    {
-        return std::format_to(ctx.out(), "{}", std::string_view(msg.buffer()));
-    }
-};
-
-template <>
-struct std::formatter<boost::core::string_view>
-{
-    constexpr auto parse(std::format_parse_context& ctx)
-    {
-        return ctx.begin();
-    }
-    auto format(const boost::core::string_view& msg, auto& ctx) const
-    {
-        return std::format_to(ctx.out(), "{}", std::string_view(msg));
-    }
-};
-
-template <>
 struct std::formatter<void*>
 {
     constexpr auto parse(std::format_parse_context& ctx)
@@ -85,35 +23,6 @@
                               std::to_string(std::bit_cast<size_t>(ptr)));
     }
 };
-
-template <>
-struct std::formatter<nlohmann::json::json_pointer>
-{
-    constexpr auto parse(std::format_parse_context& ctx)
-    {
-        return ctx.begin();
-    }
-    auto format(const nlohmann::json::json_pointer& ptr, auto& ctx) const
-    {
-        return std::format_to(ctx.out(), "{}", ptr.to_string());
-    }
-};
-
-template <>
-struct std::formatter<nlohmann::json>
-{
-    static constexpr auto parse(std::format_parse_context& ctx)
-    {
-        return ctx.begin();
-    }
-    auto format(const nlohmann::json& json, auto& ctx) const
-    {
-        return std::format_to(
-            ctx.out(), "{}",
-            json.dump(-1, ' ', false,
-                      nlohmann::json::error_handler_t::replace));
-    }
-};
 // NOLINTEND(readability-convert-member-functions-to-static, cert-dcl58-cpp)
 
 namespace crow
diff --git a/include/boost_formatters.hpp b/include/boost_formatters.hpp
new file mode 100644
index 0000000..0503d59
--- /dev/null
+++ b/include/boost_formatters.hpp
@@ -0,0 +1,63 @@
+#pragma once
+
+#include <boost/system/error_code.hpp>
+#include <boost/url/grammar.hpp>
+#include <boost/url/url_view_base.hpp>
+
+#include <format>
+
+// NOLINTBEGIN(readability-convert-member-functions-to-static, cert-dcl58-cpp)
+template <std::derived_from<boost::system::error_code> ErrorCodeType>
+struct std::formatter<ErrorCodeType>
+{
+    constexpr auto parse(std::format_parse_context& ctx)
+    {
+        return ctx.begin();
+    }
+
+    auto format(const ErrorCodeType& ec, auto& ctx) const
+    {
+        return std::format_to(ctx.out(), "{}", ec.what());
+    }
+};
+
+template <std::derived_from<boost::urls::grammar::string_view_base> StringView>
+struct std::formatter<StringView>
+{
+    constexpr auto parse(std::format_parse_context& ctx)
+    {
+        return ctx.begin();
+    }
+    auto format(const StringView& msg, auto& ctx) const
+    {
+        return std::format_to(ctx.out(), "{}",
+                              std::string_view(msg.data(), msg.size()));
+    }
+};
+
+template <std::derived_from<boost::urls::url_view_base> UrlBase>
+struct std::formatter<UrlBase>
+{
+    constexpr auto parse(std::format_parse_context& ctx)
+    {
+        return ctx.begin();
+    }
+    auto format(const UrlBase& msg, auto& ctx) const
+    {
+        return std::format_to(ctx.out(), "{}", std::string_view(msg.buffer()));
+    }
+};
+
+template <std::derived_from<boost::core::string_view> StringView>
+struct std::formatter<StringView>
+{
+    constexpr auto parse(std::format_parse_context& ctx)
+    {
+        return ctx.begin();
+    }
+    auto format(const StringView& msg, auto& ctx) const
+    {
+        return std::format_to(ctx.out(), "{}", std::string_view(msg));
+    }
+};
+// NOLINTEND(readability-convert-member-functions-to-static, cert-dcl58-cpp)
diff --git a/include/dbus_utility.hpp b/include/dbus_utility.hpp
index c06ba9e..0cd3b7e 100644
--- a/include/dbus_utility.hpp
+++ b/include/dbus_utility.hpp
@@ -15,6 +15,7 @@
  */
 #pragma once
 
+#include "boost_formatters.hpp"
 #include "dbus_singleton.hpp"
 #include "logging.hpp"
 
diff --git a/include/json_formatters.hpp b/include/json_formatters.hpp
new file mode 100644
index 0000000..ae72a08
--- /dev/null
+++ b/include/json_formatters.hpp
@@ -0,0 +1,39 @@
+#pragma once
+
+#include <nlohmann/json.hpp>
+
+#include <format>
+
+// Clang-tidy would rather these be static, but using static causes the template
+// specialization to not function.  Ignore the warning.
+// NOLINTBEGIN(readability-convert-member-functions-to-static, cert-dcl58-cpp)
+
+template <>
+struct std::formatter<nlohmann::json::json_pointer>
+{
+    constexpr auto parse(std::format_parse_context& ctx)
+    {
+        return ctx.begin();
+    }
+    auto format(const nlohmann::json::json_pointer& ptr, auto& ctx) const
+    {
+        return std::format_to(ctx.out(), "{}", ptr.to_string());
+    }
+};
+
+template <>
+struct std::formatter<nlohmann::json>
+{
+    static constexpr auto parse(std::format_parse_context& ctx)
+    {
+        return ctx.begin();
+    }
+    auto format(const nlohmann::json& json, auto& ctx) const
+    {
+        return std::format_to(
+            ctx.out(), "{}",
+            json.dump(-1, ' ', false,
+                      nlohmann::json::error_handler_t::replace));
+    }
+};
+// NOLINTEND(readability-convert-member-functions-to-static, cert-dcl58-cpp)
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 17b5931..f0b72fb 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -15,10 +15,12 @@
 #pragma once
 #include "app.hpp"
 #include "async_resp.hpp"
+#include "boost_formatters.hpp"
 #include "dbus_singleton.hpp"
 #include "dbus_utility.hpp"
 #include "http_request.hpp"
 #include "http_response.hpp"
+#include "json_formatters.hpp"
 #include "logging.hpp"
 #include "parsing.hpp"
 #include "routing.hpp"
diff --git a/redfish-core/include/utils/query_param.hpp b/redfish-core/include/utils/query_param.hpp
index 0f98763..2441c9f 100644
--- a/redfish-core/include/utils/query_param.hpp
+++ b/redfish-core/include/utils/query_param.hpp
@@ -6,6 +6,7 @@
 #include "error_messages.hpp"
 #include "http_request.hpp"
 #include "http_response.hpp"
+#include "json_formatters.hpp"
 #include "logging.hpp"
 #include "str_utility.hpp"
 
diff --git a/redfish-core/src/utils/dbus_utils.cpp b/redfish-core/src/utils/dbus_utils.cpp
index bd114a3..f30e6ed 100644
--- a/redfish-core/src/utils/dbus_utils.cpp
+++ b/redfish-core/src/utils/dbus_utils.cpp
@@ -1,6 +1,7 @@
 #include "utils/dbus_utils.hpp"
 
 #include "async_resp.hpp"
+#include "boost_formatters.hpp"
 #include "error_messages.hpp"
 #include "logging.hpp"
 
diff --git a/test/http/server_sent_event_test.cpp b/test/http/server_sent_event_test.cpp
index bf39ee8..43b830d 100644
--- a/test/http/server_sent_event_test.cpp
+++ b/test/http/server_sent_event_test.cpp
@@ -1,3 +1,4 @@
+#include "boost_formatters.hpp"
 #include "http/server_sent_event.hpp"
 
 #include <boost/asio/buffer.hpp>