diff --git a/src/toggl/mod.rs b/src/toggl/mod.rs index 12f211a..89a3b9e 100644 --- a/src/toggl/mod.rs +++ b/src/toggl/mod.rs @@ -98,8 +98,8 @@ mod types { start: DateTime, stop: Option>, - // TODO This should be an Option as all negatives signify currently running time entries - duration: i32, + #[serde(with = "duration_field")] + duration: Option, at: DateTime, @@ -115,6 +115,32 @@ mod types { server_deleted_at: Option>, permissions: Option, } + + mod duration_field { + use serde::{Deserialize, Serialize}; + + pub fn serialize(duration: &Option, serializer: S) -> Result + where + S: serde::Serializer, + { + match duration { + None => i32::serialize(&-1, serializer), + Some(duration) => i32::serialize(&(*duration as i32), serializer), + } + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: serde::Deserializer<'de>, + { + let duration = i32::deserialize(deserializer)?; + if duration < 0 { + Ok(None) + } else { + Ok(Some(duration as u32)) + } + } + } } #[derive(Debug, thiserror::Error)]