1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use chrono::Datelike;
use time::{format_description, Date, OffsetDateTime, Time};

pub fn render_datetime_and_info(datetime: &OffsetDateTime) -> String {
    let days_passed = (OffsetDateTime::now_utc() - *datetime).whole_days();
    let at_least_one_day_passed = days_passed > 0;

    let extra_info = at_least_one_day_passed
        .then(|| {
            let multiple_days_passed = days_passed > 1;
            let day_word = if multiple_days_passed { "days" } else { "day" };
            format!(" ({days_passed} {day_word} ago)")
        })
        .unwrap_or_default();
    format!(
        "{}{extra_info}",
        datetime
            .format(
                &format_description::parse("[day].[month].[year]")
                    .expect("invalid DateTime format"),
            )
            .expect("Couldn't format DateTime'")
    )
}

pub fn render_datetime_regular(datetime: &OffsetDateTime) -> String {
    datetime
        .format(
            &format_description::parse("[day].[month].[year] [hour]:[minute]")
                .expect("invalid DateTime format"),
        )
        .expect("Couldn't format DateTime'")
}

pub fn ask_datetime(prompt: &str) -> anyhow::Result<OffsetDateTime> {
    let naive_date = inquire::DateSelect::new(prompt).prompt()?;

    Ok(OffsetDateTime::new_utc(
        Date::from_ordinal_date(naive_date.year(), naive_date.ordinal() as u16)?,
        Time::from_hms(12, 0, 0)?,
    ))
}