1*081ebf06SWludzik, Jozef #pragma once 2*081ebf06SWludzik, Jozef 3*081ebf06SWludzik, Jozef #include <chrono> 4*081ebf06SWludzik, Jozef #include <string> 5*081ebf06SWludzik, Jozef 6*081ebf06SWludzik, Jozef namespace redfish 7*081ebf06SWludzik, Jozef { 8*081ebf06SWludzik, Jozef 9*081ebf06SWludzik, Jozef namespace time_utils 10*081ebf06SWludzik, Jozef { 11*081ebf06SWludzik, Jozef 12*081ebf06SWludzik, Jozef namespace details 13*081ebf06SWludzik, Jozef { 14*081ebf06SWludzik, Jozef 15*081ebf06SWludzik, Jozef inline void leftZeroPadding(std::string& str, const std::size_t padding) 16*081ebf06SWludzik, Jozef { 17*081ebf06SWludzik, Jozef if (str.size() < padding) 18*081ebf06SWludzik, Jozef { 19*081ebf06SWludzik, Jozef str.insert(0, padding - str.size(), '0'); 20*081ebf06SWludzik, Jozef } 21*081ebf06SWludzik, Jozef } 22*081ebf06SWludzik, Jozef } // namespace details 23*081ebf06SWludzik, Jozef 24*081ebf06SWludzik, Jozef /** 25*081ebf06SWludzik, Jozef * @brief Convert time value into duration format that is based on ISO 8601. 26*081ebf06SWludzik, Jozef * Example output: "P12DT1M5.5S" 27*081ebf06SWludzik, Jozef * Ref: Redfish Specification, Section 9.4.4. Duration values 28*081ebf06SWludzik, Jozef */ 29*081ebf06SWludzik, Jozef std::string toDurationString(std::chrono::milliseconds ms) 30*081ebf06SWludzik, Jozef { 31*081ebf06SWludzik, Jozef if (ms < std::chrono::milliseconds::zero()) 32*081ebf06SWludzik, Jozef { 33*081ebf06SWludzik, Jozef return ""; 34*081ebf06SWludzik, Jozef } 35*081ebf06SWludzik, Jozef 36*081ebf06SWludzik, Jozef std::string fmt; 37*081ebf06SWludzik, Jozef fmt.reserve(sizeof("PxxxxxxxxxxxxDTxxHxxMxx.xxxxxxS")); 38*081ebf06SWludzik, Jozef 39*081ebf06SWludzik, Jozef using Days = std::chrono::duration<long, std::ratio<24 * 60 * 60>>; 40*081ebf06SWludzik, Jozef Days days = std::chrono::floor<Days>(ms); 41*081ebf06SWludzik, Jozef ms -= days; 42*081ebf06SWludzik, Jozef 43*081ebf06SWludzik, Jozef std::chrono::hours hours = std::chrono::floor<std::chrono::hours>(ms); 44*081ebf06SWludzik, Jozef ms -= hours; 45*081ebf06SWludzik, Jozef 46*081ebf06SWludzik, Jozef std::chrono::minutes minutes = std::chrono::floor<std::chrono::minutes>(ms); 47*081ebf06SWludzik, Jozef ms -= minutes; 48*081ebf06SWludzik, Jozef 49*081ebf06SWludzik, Jozef std::chrono::seconds seconds = std::chrono::floor<std::chrono::seconds>(ms); 50*081ebf06SWludzik, Jozef ms -= seconds; 51*081ebf06SWludzik, Jozef 52*081ebf06SWludzik, Jozef fmt = "P"; 53*081ebf06SWludzik, Jozef if (days.count() > 0) 54*081ebf06SWludzik, Jozef { 55*081ebf06SWludzik, Jozef fmt += std::to_string(days.count()) + "D"; 56*081ebf06SWludzik, Jozef } 57*081ebf06SWludzik, Jozef fmt += "T"; 58*081ebf06SWludzik, Jozef if (hours.count() > 0) 59*081ebf06SWludzik, Jozef { 60*081ebf06SWludzik, Jozef fmt += std::to_string(hours.count()) + "H"; 61*081ebf06SWludzik, Jozef } 62*081ebf06SWludzik, Jozef if (minutes.count() > 0) 63*081ebf06SWludzik, Jozef { 64*081ebf06SWludzik, Jozef fmt += std::to_string(minutes.count()) + "M"; 65*081ebf06SWludzik, Jozef } 66*081ebf06SWludzik, Jozef if (seconds.count() != 0 || ms.count() != 0) 67*081ebf06SWludzik, Jozef { 68*081ebf06SWludzik, Jozef fmt += std::to_string(seconds.count()) + "."; 69*081ebf06SWludzik, Jozef std::string msStr = std::to_string(ms.count()); 70*081ebf06SWludzik, Jozef details::leftZeroPadding(msStr, 3); 71*081ebf06SWludzik, Jozef fmt += msStr + "S"; 72*081ebf06SWludzik, Jozef } 73*081ebf06SWludzik, Jozef 74*081ebf06SWludzik, Jozef return fmt; 75*081ebf06SWludzik, Jozef } 76*081ebf06SWludzik, Jozef 77*081ebf06SWludzik, Jozef } // namespace time_utils 78*081ebf06SWludzik, Jozef } // namespace redfish 79