diff --git a/nano/lib/logging.cpp b/nano/lib/logging.cpp index 7fbfb0b6..7f6a6bd3 100644 --- a/nano/lib/logging.cpp +++ b/nano/lib/logging.cpp @@ -481,12 +481,12 @@ nano::log_config nano::load_log_config (nano::log_config fallback, const std::fi if (env_levels) { std::map levels; - for (auto const & env_level_str : nano::util::split (*env_levels, ',')) + for (auto const & env_level_str : nano::util::split (*env_levels, ",")) { try { // Split 'logger_name=level' into a pair of 'logger_name' and 'level' - auto arr = nano::util::split (env_level_str, '='); + auto arr = nano::util::split (env_level_str, "="); if (arr.size () != 2) { throw std::invalid_argument ("Invalid entry: " + env_level_str); @@ -579,16 +579,14 @@ std::string nano::log::to_string (nano::log::logger_id logger_id) */ nano::log::logger_id nano::log::parse_logger_id (const std::string & logger_name) { - auto pos = logger_name.find ("::"); - if (pos == std::string::npos) + auto parts = nano::util::split (logger_name, "::"); + if (parts.size () == 1) { - return { nano::log::parse_type (logger_name), nano::log::detail::all }; + return { nano::log::parse_type (parts[0]), nano::log::detail::all }; } - else + if (parts.size () == 2) { - auto logger_type = logger_name.substr (0, pos); - auto logger_detail = logger_name.substr (pos + 1); - - return { nano::log::parse_type (logger_type), nano::log::parse_detail (logger_detail) }; + return { nano::log::parse_type (parts[0]), nano::log::parse_detail (parts[1]) }; } + throw std::invalid_argument ("Invalid logger name: " + logger_name); } \ No newline at end of file diff --git a/nano/lib/utility.hpp b/nano/lib/utility.hpp index 97d8bd3a..7b2ce35c 100644 --- a/nano/lib/utility.hpp +++ b/nano/lib/utility.hpp @@ -246,15 +246,19 @@ std::string join (Container const & container, std::string_view delimiter, Func return join (container.begin (), container.end (), delimiter, transform); } -inline std::vector split (const std::string & str, char delimiter) +inline std::vector split (std::string const & input, std::string_view delimiter) { - std::stringstream ss{ str }; std::vector result; - std::string item; - while (std::getline (ss, item, delimiter)) + std::size_t startPos = 0; + std::size_t delimiterPos = input.find (delimiter, startPos); + while (delimiterPos != std::string::npos) { - result.push_back (item); + std::string token = input.substr (startPos, delimiterPos - startPos); + result.push_back (token); + startPos = delimiterPos + delimiter.length (); + delimiterPos = input.find (delimiter, startPos); } + result.push_back (input.substr (startPos)); return result; }