codeberg_cli/render/
datetime.rs

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