ergani 0.2.1

Rust SDK for the Greek government Ergani API for employee workflows
Documentation
#![allow(dead_code)]

use crate::models::types::schedule_work_type::ScheduleWorkType;
use crate::models::work_day_details::WorkDayDetails;
use anyhow::{bail, Result};
use chrono::{DateTime, Utc};

#[derive(Default)]
pub struct WorkDayDetailsBuilder {
    pub(crate) work_type: Option<ScheduleWorkType>,
    pub(crate) start_time: DateTime<Utc>,
    pub(crate) end_time: DateTime<Utc>,
}

impl WorkDayDetailsBuilder {
    pub fn builder() -> WorkDayDetailsBuilder {
        WorkDayDetailsBuilder::default()
    }

    pub fn build(self) -> Result<WorkDayDetails> {
        let work_type = match self.work_type {
            Some(wt) => wt,
            None => bail!("Work type is required"),
        };

        Ok(WorkDayDetails {
            start_time: self.start_time,
            end_time: self.end_time,
            work_type,
        })
    }

    pub fn set_work_type(mut self, work_type: ScheduleWorkType) -> Self {
        self.work_type = Some(work_type);
        self
    }

    pub fn set_start_time(mut self, start_time: DateTime<Utc>) -> Self {
        self.start_time = start_time;
        self
    }

    pub fn set_end_time(mut self, end_time: DateTime<Utc>) -> Self {
        self.end_time = end_time;
        self
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_serialize_work_day_details_build_fails_when_work_type_not_set() {
        let start_time = "2014-11-28T12:00:00Z";
        let end_time = "2014-11-28T16:00:00Z";
        let work_day_details = WorkDayDetailsBuilder::builder()
            .set_start_time(start_time.parse::<DateTime<Utc>>().unwrap())
            .set_end_time(end_time.parse::<DateTime<Utc>>().unwrap())
            .build();

        assert!(work_day_details.is_err());
        assert_eq!(
            work_day_details.err().unwrap().to_string(),
            "Work type is required"
        );
    }

    #[test]
    fn test_serialize_work_day_details_build_is_ok() {
        let start_time = "2014-11-28T12:00:00Z";
        let end_time = "2014-11-28T16:00:00Z";
        let work_day_details = WorkDayDetailsBuilder::builder()
            .set_work_type(ScheduleWorkType::WorkFromHome)
            .set_start_time(start_time.parse::<DateTime<Utc>>().unwrap())
            .set_end_time(end_time.parse::<DateTime<Utc>>().unwrap())
            .build();

        assert!(work_day_details.is_ok());
    }
}