use std::fmt::Formatter;
use std::fmt::Result as FmtResult;
use std::marker::PhantomData;
use serde::Deserialize;
use serde::de::Error as _;
use serde::de::SeqAccess;
use serde::de::Visitor;
use super::FiniteFloat;
use crate::finite_float::NON_FINITE_FLOAT_MESSAGE;
pub(in crate::finite_float) struct FiniteFloatSequenceVisitor<T> {
marker: PhantomData<fn() -> T>,
}
impl<T> FiniteFloatSequenceVisitor<T> {
#[must_use]
#[inline]
pub(in crate::finite_float) const fn new() -> Self {
Self { marker: PhantomData }
}
}
impl<'de, T> Visitor<'de> for FiniteFloatSequenceVisitor<T>
where
T: Deserialize<'de> + FiniteFloat,
{
type Value = Vec<T>;
fn expecting(&self, formatter: &mut Formatter<'_>) -> FmtResult {
formatter.write_str("a sequence of finite floating-point values")
}
fn visit_seq<A>(self, mut sequence: A) -> Result<Self::Value, A::Error>
where
A: SeqAccess<'de>,
{
let mut values = Vec::new();
while let Some(value) = sequence.next_element::<T>()? {
if !value.is_finite() {
return Err(A::Error::custom(NON_FINITE_FLOAT_MESSAGE));
}
values.push(value);
}
Ok(values)
}
}