Wrapper for std::time::Duration to deal with durations from human readable form
Main goal is to declare a Duration from, as well as formatting into, a human readable string.
Parsing a string, adds all values with a time unit to the total duration, so parse("1min 2s 1min") results in a 122s duration.
Formatting as a string uses the unit for which an integral value can be represented, so a 122s duration will format as 122s, but a 86400s duration will format as 1day.
Formatting as pretty print includes all units that have a non-zero value, so 122s will pretty print as "2min 2s" and 90060 as "1 day 1h 1m"
```rust
let duration = DurationHuman::tryfrom("80h").unwrap(); asserteq!(format!("{:#}", duration), "3 days 8h".tostring()); asserteq!(format!("{}", duration), "80h".tostring()); let duration = DurationHuman::tryfrom("72h").unwrap(); asserteq!(format!("{:#}", duration), "3 days".tostring()); asserteq!(format!("{}", duration), "3 days".tostring()); let duration = DurationHuman::tryfrom("18446744073709551615ns").unwrap(); asserteq!(format!("{:#}", duration), "5 centuries 84 years 11 months 1 week 6 days 23h 34min 33s 709ms 551μs 615ns".tostring()); // precision is nano second let duration = DurationHuman::tryfrom("604800μs").unwrap(); asserteq!(format!("{:#}", duration), "604ms 800μs".tostring()); asserteq!(duration.tostring(), "604800μs".tostring()); let duration = DurationHuman::tryfrom("604800ms").unwrap(); asserteq!(format!("{:#}", duration), "10min 4s 800ms".tostring()); asserteq!(duration.tostring(), "604800ms".tostring()); let duration = DurationHuman::tryfrom("604800s").unwrap(); asserteq!(format!("{:#}", duration), "1 week".tostring()); let duration = DurationHuman::tryfrom("604800s").unwrap(); asserteq!(format!("{:#}", duration), "1 week".tostring()); asserteq!(format!("{}", duration), "1 week".tostring()); let duration = DurationHuman::tryfrom("608430s").unwrap(); asserteq!(format!("{:#}", duration), "1 week 1h 30s".tostring()); asserteq!(format!("{}", duration), "608430s".tostring()); ```
std::time::Instant supports Add
let instant = Instant::now(); let duration = DurationHuman::tryfrom("420s")?; let after = duration + instant; let diff = DurationHuman::from(after - instant); asserteq!(format!("{}", diff), format!("7min")); ```