1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#![doc = "Fast converter various time formats into milliseconds."]
#![doc(issue_tracker_base_url = "https://github.com/Mnwa/ms/issues/")]
#![doc(html_root_url = "https://docs.rs/ms-converter/")]
use std::fmt::Formatter;
const SECOND: f64 = 1000_f64;
const MINUTE: f64 = SECOND * 60_f64;
const HOUR: f64 = MINUTE * 60_f64;
const DAY: f64 = HOUR * 24_f64;
const WEEK: f64 = DAY * 7_f64;
const YEAR: f64 = DAY * 365.25_f64;
pub fn ms(s: &str) -> Result<f64, Error> {
let value_count = s
.chars()
.take_while(|c| c >= &'0' && c <= &'9' || c == &'.' || c == &'-')
.count();
let (value, postfix) = s.split_at(value_count);
let value = value
.parse::<f64>()
.map_or(Err(Error::new("invalid value")), |v| Ok(v))?;
let postfix = postfix.trim();
match postfix {
"years" | "year" | "yrs" | "yr" | "y" => Ok(value * YEAR),
"weeks" | "week" | "w" => Ok(value * WEEK),
"days" | "day" | "d" => Ok(value * DAY),
"hours" | "hour" | "hrs" | "hr" | "h" => Ok(value * HOUR),
"minutes" | "minute" | "mins" | "min" | "m" => Ok(value * MINUTE),
"seconds" | "second" | "secs" | "sec" | "s" => Ok(value * SECOND),
"milliseconds" | "millisecond" | "msecs" | "msec" | "ms" | "" => Ok(value),
_ => Err(Error::new("invalid postfix")),
}
}
#[derive(Debug)]
pub struct Error {
message: &'static str,
}
impl Error {
pub fn new(message: &'static str) -> Error {
Error { message }
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.message)
}
}
impl std::error::Error for Error {}
#[cfg(test)]
mod tests;