use std::fmt::Display;
use std::marker::PhantomData;
use serde::de;
use serde::de::DeserializeSeed;
use super::bounded_string_visitor::BoundedStringVisitor;
pub(crate) struct BoundedStringSeed<F, E> {
validate: F,
error: PhantomData<fn() -> E>,
}
impl<F, E> BoundedStringSeed<F, E> {
#[must_use]
#[inline]
pub(crate) fn new(validate: F) -> Self {
Self {
validate,
error: PhantomData,
}
}
}
impl<'de, F, E> DeserializeSeed<'de> for BoundedStringSeed<F, E>
where
F: FnOnce(&str) -> Result<(), E>,
E: Display,
{
type Value = String;
fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
where
D: de::Deserializer<'de>,
{
deserializer.deserialize_string(BoundedStringVisitor {
validate: self.validate,
_error: PhantomData,
})
}
}