codeberg_cli/render/
datetime.rs1use chrono::Datelike;
2use miette::IntoDiagnostic;
3use time::{Date, OffsetDateTime, Time, format_description};
4
5pub fn render_datetime_and_info(datetime: &OffsetDateTime) -> String {
6 let days_passed = (OffsetDateTime::now_utc() - *datetime).whole_days();
7 let at_least_one_day_passed = days_passed > 0;
8
9 let extra_info = if at_least_one_day_passed {
10 {
11 let multiple_days_passed = days_passed > 1;
12 let day_word = if multiple_days_passed { "days" } else { "day" };
13 format!(" ({days_passed} {day_word} ago)")
14 }
15 } else {
16 Default::default()
17 };
18 format!(
19 "{}{extra_info}",
20 datetime
21 .format(
22 &format_description::parse("[day].[month].[year]")
23 .expect("invalid DateTime format"),
24 )
25 .expect("Couldn't format DateTime'")
26 )
27}
28
29pub fn render_datetime_regular(datetime: &OffsetDateTime) -> String {
30 datetime
31 .format(
32 &format_description::parse("[day].[month].[year] [hour]:[minute]")
33 .expect("invalid DateTime format"),
34 )
35 .expect("Couldn't format DateTime'")
36}
37
38pub fn ask_datetime(prompt: &str) -> miette::Result<OffsetDateTime> {
39 let naive_date = inquire::DateSelect::new(prompt)
40 .prompt()
41 .into_diagnostic()?;
42
43 Ok(OffsetDateTime::new_utc(
44 Date::from_ordinal_date(naive_date.year(), naive_date.ordinal() as u16)
45 .into_diagnostic()?,
46 Time::from_hms(12, 0, 0).into_diagnostic()?,
47 ))
48}