codeberg_cli/render/
datetime.rs1use 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}