use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;
use serde::Serializer;
use serde::de::Error as _;
use serde::ser::Error as SerializeError;
mod internal;
use self::internal::FiniteFloat;
pub(crate) const NON_FINITE_FLOAT_MESSAGE: &str = "non-finite floating-point value";
#[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(SerializeError::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(SerializeError::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;
use serde::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;
use serde::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;
use serde::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;
use serde::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)
}
}