mod internal;
use internal::FiniteFloat;
pub(crate) const NON_FINITE_FLOAT_MESSAGE: &str =
"non-finite floating-point value";
use serde::de::Error as _;
use serde::{
Deserialize,
Deserializer,
Serialize,
Serializer,
};
#[inline]
fn serialize_finite<T, S>(
value: &T,
serializer: S,
serialize: impl FnOnce(S, T) -> Result<S::Ok, S::Error>,
) -> Result<S::Ok, S::Error>
where
T: FiniteFloat,
S: Serializer,
{
if !value.is_finite() {
return Err(serde::ser::Error::custom(NON_FINITE_FLOAT_MESSAGE));
}
serialize(serializer, *value)
}
#[inline]
fn deserialize_finite<'de, T, D>(deserializer: D) -> Result<T, D::Error>
where
T: Deserialize<'de> + FiniteFloat,
D: Deserializer<'de>,
{
let value = T::deserialize(deserializer)?;
if !value.is_finite() {
return Err(D::Error::custom(NON_FINITE_FLOAT_MESSAGE));
}
Ok(value)
}
fn serialize_finite_vec<T, S>(
values: &[T],
serializer: S,
) -> Result<S::Ok, S::Error>
where
T: FiniteFloat + Serialize,
S: Serializer,
{
if values.iter().any(|value| !value.is_finite()) {
return Err(serde::ser::Error::custom(NON_FINITE_FLOAT_MESSAGE));
}
values.serialize(serializer)
}
fn deserialize_finite_vec<'de, T, D>(
deserializer: D,
) -> Result<Vec<T>, D::Error>
where
T: Deserialize<'de> + FiniteFloat,
D: Deserializer<'de>,
{
let values = Vec::<T>::deserialize(deserializer)?;
if values.iter().any(|value| !value.is_finite()) {
return Err(D::Error::custom(NON_FINITE_FLOAT_MESSAGE));
}
Ok(values)
}
pub(crate) mod float32 {
use serde::{
Deserializer,
Serializer,
};
#[inline(always)]
pub(crate) fn serialize<S>(
value: &f32,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
super::serialize_finite(value, serializer, Serializer::serialize_f32)
}
#[inline(always)]
pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<f32, D::Error>
where
D: Deserializer<'de>,
{
super::deserialize_finite(deserializer)
}
}
pub(crate) mod float64 {
use serde::{
Deserializer,
Serializer,
};
#[inline(always)]
pub(crate) fn serialize<S>(
value: &f64,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
super::serialize_finite(value, serializer, Serializer::serialize_f64)
}
#[inline(always)]
pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<f64, D::Error>
where
D: Deserializer<'de>,
{
super::deserialize_finite(deserializer)
}
}
pub(crate) mod float32_vec {
use serde::{
Deserializer,
Serializer,
};
#[inline(always)]
pub(crate) fn serialize<S>(
values: &[f32],
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
super::serialize_finite_vec(values, serializer)
}
#[inline(always)]
pub(crate) fn deserialize<'de, D>(
deserializer: D,
) -> Result<Vec<f32>, D::Error>
where
D: Deserializer<'de>,
{
super::deserialize_finite_vec(deserializer)
}
}
pub(crate) mod float64_vec {
use serde::{
Deserializer,
Serializer,
};
#[inline(always)]
pub(crate) fn serialize<S>(
values: &[f64],
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
super::serialize_finite_vec(values, serializer)
}
#[inline(always)]
pub(crate) fn deserialize<'de, D>(
deserializer: D,
) -> Result<Vec<f64>, D::Error>
where
D: Deserializer<'de>,
{
super::deserialize_finite_vec(deserializer)
}
}