use std::time::Duration;
use qubit_datatype::DataConverter;
use serde::de::Error;
use serde::{
Deserialize,
Deserializer,
Serializer,
};
use super::duration_millis::MILLISECOND_CONVERSION_OPTIONS;
pub fn serialize<S>(duration: &Duration, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let text = format(duration);
serializer.serialize_str(&text)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Duration, D::Error>
where
D: Deserializer<'de>,
{
let value = serde_json::Value::deserialize(deserializer)?;
match value {
serde_json::Value::Number(number) => {
let millis = number
.as_u64()
.ok_or_else(|| D::Error::custom("duration integer must be a non-negative u64"))?;
DataConverter::from(millis)
.to_with::<Duration>(&MILLISECOND_CONVERSION_OPTIONS)
.map_err(D::Error::custom)
}
serde_json::Value::String(text) => parse(&text).map_err(D::Error::custom),
_ => Err(D::Error::custom(
"duration must be a string with unit or a millisecond integer",
)),
}
}
#[inline]
pub fn format(duration: &Duration) -> String {
DataConverter::from(*duration)
.to_with::<String>(&MILLISECOND_CONVERSION_OPTIONS)
.expect("Duration to String conversion should be infallible")
}
#[inline]
pub fn parse(text: &str) -> Result<Duration, String> {
DataConverter::from(text)
.to_with::<Duration>(&MILLISECOND_CONVERSION_OPTIONS)
.map_err(|error| error.to_string())
}