bartib 1.1.0

A simple timetracker for the command line
Documentation
use chrono::Duration;

use crate::data::activity;
use crate::data::round_util::round_datetime;

pub type ProcessorList = Vec<Box<dyn ActivityProcessor>>;

pub trait ActivityProcessor {
    fn process(&self, activity: &activity::Activity) -> activity::Activity;
}

pub struct RoundProcessor {
    pub round: Duration,
}

impl ActivityProcessor for RoundProcessor {
    fn process(&self, activity: &activity::Activity) -> activity::Activity {
        let start = round_datetime(&activity.start, &self.round);
        let end = activity.end.map(|end| round_datetime(&end, &self.round));

        activity::Activity {
            start,
            end,
            project: activity.project.clone(),
            description: activity.description.clone(),
        }
    }
}

pub fn process_activities(
    activities: Vec<&activity::Activity>,
    processors: ProcessorList,
) -> Vec<activity::Activity> {
    activities
        .into_iter()
        .cloned()
        .map(|activity| {
            processors
                .iter()
                .fold(activity, |activity, processor| processor.process(&activity))
        })
        .collect()
}