use std::sync::LazyLock;
use std::time::Duration;
use qubit_datatype::{
DataConversionOptions,
DataConverter,
DurationConversionOptions,
DurationUnit,
};
use serde::de::Error as DeserializeError;
use serde::ser::Error as SerializeError;
use serde::{
Deserialize,
Deserializer,
Serializer,
};
pub(super) static MILLISECOND_CONVERSION_OPTIONS: LazyLock<DataConversionOptions> =
LazyLock::new(|| {
DataConversionOptions::default().with_duration_options(
DurationConversionOptions::default()
.with_unit(DurationUnit::Milliseconds)
.with_append_unit_suffix(true),
)
});
pub fn serialize<S>(duration: &Duration, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let millis = DataConverter::from(*duration)
.to_with::<u64>(&MILLISECOND_CONVERSION_OPTIONS)
.map_err(S::Error::custom)?;
serializer.serialize_u64(millis)
}
pub fn deserialize<'de, D>(deserializer: D) -> Result<Duration, D::Error>
where
D: Deserializer<'de>,
{
let millis = u64::deserialize(deserializer)?;
DataConverter::from(millis)
.to_with::<Duration>(&MILLISECOND_CONVERSION_OPTIONS)
.map_err(D::Error::custom)
}