use crate::dates::Duration;
use chrono::{DateTime, Local};
use std::time;
use crate::dates::convert::*;
use miette::{IntoDiagnostic, Result};
impl Duration {
pub fn get(&mut self) -> Result<time::Duration> {
let duration: time::Duration;
if self.computed.is_some() {
duration = iso8601_to_std_duration(&self.computed.clone().unwrap())?;
} else if self.ended_at.is_some() {
let diff = self.get_ended_at()? - self.get_started_at()?;
duration = diff.to_std().unwrap();
self.computed = std_duration_to_iso8601(&duration).ok();
} else {
let diff = Local::now() - self.get_started_at()?;
duration = diff.to_std().unwrap();
}
Ok(duration)
}
pub fn start(&mut self) -> Result<()> {
let now = Local::now();
self.started_at = Some(now.to_string());
Ok(())
}
pub fn stop(&mut self) -> Result<()> {
let now = Local::now();
self.ended_at = Some(now.to_string());
let diff = self.get_ended_at()? - self.get_started_at()?;
let diff = diff.to_std().unwrap();
self.computed = Some(std_duration_to_iso8601(&diff)?);
Ok(())
}
fn get_started_at(&self) -> Result<DateTime<Local>> {
let parsed = self
.started_at
.clone()
.unwrap()
.parse::<DateTime<Local>>()
.into_diagnostic()?;
Ok(parsed)
}
fn get_ended_at(&self) -> Result<DateTime<Local>> {
let parsed = self
.ended_at
.clone()
.unwrap()
.parse::<DateTime<Local>>()
.into_diagnostic()?;
Ok(parsed)
}
}
#[cfg(test)]
mod convert {
use crate::dates::types::Duration;
#[test]
fn string_to_duration() {
let mut d = Duration::default();
d.start().unwrap();
d.stop().unwrap();
assert!(d.computed.is_some());
}
}