codeberg_cli/render/
datetime.rs

1use chrono::Datelike;
2use time::{format_description, Date, OffsetDateTime, Time};
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 = at_least_one_day_passed
9        .then(|| {
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        .unwrap_or_default();
15    format!(
16        "{}{extra_info}",
17        datetime
18            .format(
19                &format_description::parse("[day].[month].[year]")
20                    .expect("invalid DateTime format"),
21            )
22            .expect("Couldn't format DateTime'")
23    )
24}
25
26pub fn render_datetime_regular(datetime: &OffsetDateTime) -> String {
27    datetime
28        .format(
29            &format_description::parse("[day].[month].[year] [hour]:[minute]")
30                .expect("invalid DateTime format"),
31        )
32        .expect("Couldn't format DateTime'")
33}
34
35pub fn ask_datetime(prompt: &str) -> anyhow::Result<OffsetDateTime> {
36    let naive_date = inquire::DateSelect::new(prompt).prompt()?;
37
38    Ok(OffsetDateTime::new_utc(
39        Date::from_ordinal_date(naive_date.year(), naive_date.ordinal() as u16)?,
40        Time::from_hms(12, 0, 0)?,
41    ))
42}