diff options
Diffstat (limited to 'pkgs/by-name/yt/yt/src/select/selection_file/duration.rs')
-rw-r--r-- | pkgs/by-name/yt/yt/src/select/selection_file/duration.rs | 52 |
1 files changed, 42 insertions, 10 deletions
diff --git a/pkgs/by-name/yt/yt/src/select/selection_file/duration.rs b/pkgs/by-name/yt/yt/src/select/selection_file/duration.rs index 700d9202..9e4b3a83 100644 --- a/pkgs/by-name/yt/yt/src/select/selection_file/duration.rs +++ b/pkgs/by-name/yt/yt/src/select/selection_file/duration.rs @@ -1,14 +1,46 @@ +use std::str::FromStr; + +use anyhow::{Context, Result}; + +#[derive(Copy, Clone, Debug)] pub struct Duration { time: u32, } -impl From<&str> for Duration { - fn from(v: &str) -> Self { - let buf: Vec<_> = v.split(':').take(2).collect(); - Self { - time: (buf[0].parse::<u32>().expect("Should be a number") * 60) - + buf[1].parse::<u32>().expect("Should be a number"), +impl FromStr for Duration { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result<Self, Self::Err> { + fn parse_num(str: &str, suffix: char) -> Result<u32> { + str.strip_suffix(suffix) + .expect("it has a 'h' suffix") + .parse::<u32>() + .context("Failed to parse hours") } + + let buf: Vec<_> = s.split(' ').collect(); + + let hours; + let minutes; + let seconds; + + assert_eq!(buf.len(), 2, "Other lengths should not happen"); + + if buf[0].ends_with('h') { + hours = parse_num(buf[0], 'h')?; + minutes = parse_num(buf[1], 'm')?; + seconds = 0; + } else if buf[0].ends_with('m') { + hours = 0; + minutes = parse_num(buf[0], 'm')?; + seconds = parse_num(buf[1], 's')?; + } else { + unreachable!("The first part always ends with 'h' or 'm'") + } + + Ok(Self { + time: (hours * 60 * 60) + (minutes * 60) + seconds, + }) } } @@ -37,9 +69,9 @@ impl std::fmt::Display for Duration { if self.time == 0 { write!(f, "[No Duration]") } else if h > 0 { - write!(f, "[{h}h {m}m]") + write!(f, "{h}h {m}m") } else { - write!(f, "[{m}m {s}s]") + write!(f, "{m}m {s}s") } } } @@ -50,11 +82,11 @@ mod test { #[test] fn test_display_duration_1h() { let dur = Duration { time: 60 * 60 }; - assert_eq!("[1h 0m]".to_owned(), dur.to_string()); + assert_eq!("1h 0m".to_owned(), dur.to_string()); } #[test] fn test_display_duration_30min() { let dur = Duration { time: 60 * 30 }; - assert_eq!("[30m 0s]".to_owned(), dur.to_string()); + assert_eq!("30m 0s".to_owned(), dur.to_string()); } } |