rtw 2.3.1

time tracker command line tool
Documentation
use crate::rtw_core::clock::Clock;
use crate::rtw_core::service::ActivityService;
use crate::rtw_core::storage::Storage;
use crate::service::Service;
use chrono::Duration;
use chrono_humanize::HumanTime;
use itertools::Itertools;

pub(crate) type FormatString = String;

pub(crate) fn format_status<S, Cl>(
    format_string: Option<FormatString>,
    service: &Service<S>,
    clock: &Cl,
) -> anyhow::Result<Option<String>>
where
    S: Storage,
    Cl: Clock,
{
    let format_string = format_string.unwrap_or_else(|| String::from("{ongoing}"));
    let now = clock.get_time();
    let ongoing_activities = service.get_ongoing_activities()?;
    if !ongoing_activities.is_empty() {
        Ok(Some(
            ongoing_activities
                .iter()
                .map(|(id, ongoing)| {
                    let started: Duration = (ongoing.start_time - now).into();
                    format_string
                        .replace("{id}", &format!("{}", id))
                        .replace("{ongoing}", &ongoing.get_title())
                        .replace("{start}", &format!("{}", ongoing.start_time))
                        .replace("{human_duration}", &format!("{}", HumanTime::from(started)))
                        .replace("{duration}", &format!("{}", now - ongoing.start_time))
                })
                .join(" "),
        ))
    } else {
        Ok(None)
    }
}