1081ebf06SWludzik, Jozef #pragma once 2081ebf06SWludzik, Jozef 3081ebf06SWludzik, Jozef #include <chrono> 4081ebf06SWludzik, Jozef #include <string> 5081ebf06SWludzik, Jozef 6081ebf06SWludzik, Jozef namespace redfish 7081ebf06SWludzik, Jozef { 8081ebf06SWludzik, Jozef 9081ebf06SWludzik, Jozef namespace time_utils 10081ebf06SWludzik, Jozef { 11081ebf06SWludzik, Jozef 12081ebf06SWludzik, Jozef namespace details 13081ebf06SWludzik, Jozef { 14081ebf06SWludzik, Jozef 15081ebf06SWludzik, Jozef inline void leftZeroPadding(std::string& str, const std::size_t padding) 16081ebf06SWludzik, Jozef { 17081ebf06SWludzik, Jozef if (str.size() < padding) 18081ebf06SWludzik, Jozef { 19081ebf06SWludzik, Jozef str.insert(0, padding - str.size(), '0'); 20081ebf06SWludzik, Jozef } 21081ebf06SWludzik, Jozef } 22081ebf06SWludzik, Jozef } // namespace details 23081ebf06SWludzik, Jozef 24081ebf06SWludzik, Jozef /** 25081ebf06SWludzik, Jozef * @brief Convert time value into duration format that is based on ISO 8601. 26081ebf06SWludzik, Jozef * Example output: "P12DT1M5.5S" 27081ebf06SWludzik, Jozef * Ref: Redfish Specification, Section 9.4.4. Duration values 28081ebf06SWludzik, Jozef */ 29*b00dcc27SEd Tanous inline std::string toDurationString(std::chrono::milliseconds ms) 30081ebf06SWludzik, Jozef { 31081ebf06SWludzik, Jozef if (ms < std::chrono::milliseconds::zero()) 32081ebf06SWludzik, Jozef { 33081ebf06SWludzik, Jozef return ""; 34081ebf06SWludzik, Jozef } 35081ebf06SWludzik, Jozef 36081ebf06SWludzik, Jozef std::string fmt; 37081ebf06SWludzik, Jozef fmt.reserve(sizeof("PxxxxxxxxxxxxDTxxHxxMxx.xxxxxxS")); 38081ebf06SWludzik, Jozef 39081ebf06SWludzik, Jozef using Days = std::chrono::duration<long, std::ratio<24 * 60 * 60>>; 40081ebf06SWludzik, Jozef Days days = std::chrono::floor<Days>(ms); 41081ebf06SWludzik, Jozef ms -= days; 42081ebf06SWludzik, Jozef 43081ebf06SWludzik, Jozef std::chrono::hours hours = std::chrono::floor<std::chrono::hours>(ms); 44081ebf06SWludzik, Jozef ms -= hours; 45081ebf06SWludzik, Jozef 46081ebf06SWludzik, Jozef std::chrono::minutes minutes = std::chrono::floor<std::chrono::minutes>(ms); 47081ebf06SWludzik, Jozef ms -= minutes; 48081ebf06SWludzik, Jozef 49081ebf06SWludzik, Jozef std::chrono::seconds seconds = std::chrono::floor<std::chrono::seconds>(ms); 50081ebf06SWludzik, Jozef ms -= seconds; 51081ebf06SWludzik, Jozef 52081ebf06SWludzik, Jozef fmt = "P"; 53081ebf06SWludzik, Jozef if (days.count() > 0) 54081ebf06SWludzik, Jozef { 55081ebf06SWludzik, Jozef fmt += std::to_string(days.count()) + "D"; 56081ebf06SWludzik, Jozef } 57081ebf06SWludzik, Jozef fmt += "T"; 58081ebf06SWludzik, Jozef if (hours.count() > 0) 59081ebf06SWludzik, Jozef { 60081ebf06SWludzik, Jozef fmt += std::to_string(hours.count()) + "H"; 61081ebf06SWludzik, Jozef } 62081ebf06SWludzik, Jozef if (minutes.count() > 0) 63081ebf06SWludzik, Jozef { 64081ebf06SWludzik, Jozef fmt += std::to_string(minutes.count()) + "M"; 65081ebf06SWludzik, Jozef } 66081ebf06SWludzik, Jozef if (seconds.count() != 0 || ms.count() != 0) 67081ebf06SWludzik, Jozef { 68081ebf06SWludzik, Jozef fmt += std::to_string(seconds.count()) + "."; 69081ebf06SWludzik, Jozef std::string msStr = std::to_string(ms.count()); 70081ebf06SWludzik, Jozef details::leftZeroPadding(msStr, 3); 71081ebf06SWludzik, Jozef fmt += msStr + "S"; 72081ebf06SWludzik, Jozef } 73081ebf06SWludzik, Jozef 74081ebf06SWludzik, Jozef return fmt; 75081ebf06SWludzik, Jozef } 76081ebf06SWludzik, Jozef 77081ebf06SWludzik, Jozef } // namespace time_utils 78081ebf06SWludzik, Jozef } // namespace redfish 79