use clap::{Arg, command};
use fundu::{DurationParser, SaturatingInto};
const PARSER: DurationParser = DurationParser::builder()
.all_time_units()
.allow_negative()
.build();
fn main() {
let matches = command!()
.about("Conversion of fundu's duration to other durations")
.allow_negative_numbers(true)
.allow_hyphen_values(true)
.arg(
Arg::new("DURATION")
.action(clap::ArgAction::Set)
.help("A duration"),
)
.get_matches();
let input: &String = matches
.get_one("DURATION")
.expect("One argument must be present");
match PARSER.parse(input.trim()) {
Ok(duration) => {
println!("Input was: '{input}'");
println!("fundu::Duration: {duration:?}");
println!("fundu::Duration as human readable string: {duration}\n");
match std::time::Duration::try_from(duration) {
Ok(duration) => {
println!("Conversion to std::time::Duration: {duration:?}")
}
Err(error) => println!(
"Error converting to std::time::Duration: The original error message was: \
'{error}'"
),
};
println!(
"Saturating conversion with SaturatingInto::<std::time::Duration>: {:?}\n",
SaturatingInto::<std::time::Duration>::saturating_into(duration)
);
match chrono::Duration::try_from(duration) {
Ok(duration) => {
println!("Conversion to chrono::Duration: {duration:?}")
}
Err(error) => println!(
"Error converting to chrono::Duration: The original error message was: \
'{error}'"
),
};
println!(
"Saturating conversion with SaturatingInto::<chrono::Duration>: {:?}\n",
SaturatingInto::<chrono::Duration>::saturating_into(duration)
);
match time::Duration::try_from(duration) {
Ok(duration) => {
println!("Conversion to time::Duration: {duration:?}")
}
Err(error) => println!(
"Error converting to time::Duration: The original error message was: '{error}'"
),
};
println!(
"Saturating conversion with SaturatingInto::<time::Duration>: {:?}",
SaturatingInto::<time::Duration>::saturating_into(duration)
);
}
Err(error) => println!("Error parsing duration '{input}': {error}"),
}
}