Skip to main content

codeberg_cli/render/
datetime.rs

1use 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}