in src/common/src/time_ext.rs [91:136]
fn from_str(dur_str: &str) -> std::result::Result<ReadableDuration, String> {
let dur_str = dur_str.trim();
if !dur_str.is_ascii() {
return Err(format!("unexpected ascii string: {dur_str}"));
}
let err_msg = "valid duration, only d, h, m, s, ms are supported.".to_owned();
let mut left = dur_str.as_bytes();
let mut last_unit = DAY + 1;
let mut dur = 0f64;
while let Some(idx) = left.iter().position(|c| b"dhms".contains(c)) {
let (first, second) = left.split_at(idx);
let unit = if second.starts_with(b"ms") {
left = &left[idx + 2..];
MS
} else {
let u = match second[0] {
b'd' => DAY,
b'h' => HOUR,
b'm' => MINUTE,
b's' => SECOND,
_ => return Err(err_msg),
};
left = &left[idx + 1..];
u
};
if unit >= last_unit {
return Err("d, h, m, s, ms should occur in given order.".to_owned());
}
// do we need to check 12h360m?
let number_str = unsafe { std::str::from_utf8_unchecked(first) };
dur += match number_str.trim().parse::<f64>() {
Ok(n) => n * unit as f64,
Err(_) => return Err(err_msg),
};
last_unit = unit;
}
if !left.is_empty() {
return Err(err_msg);
}
if dur.is_sign_negative() {
return Err("duration should be positive.".to_owned());
}
let secs = dur as u64 / SECOND;
let millis = (dur as u64 % SECOND) as u32 * 1_000_000;
Ok(ReadableDuration(Duration::new(secs, millis)))
}