topcoat-runtime 0.10.0

A modular, batteries-included Rust web framework for server-rendered apps.
Documentation
use serde::{Deserialize, de};

use crate::{Surrogate, Surrogated};

#[derive(Deserialize)]
#[serde(deny_unknown_fields)]
struct Sequence<V> {
    t: String,
    bits: u32,
    v: Vec<V>,
}

pub(super) fn deserialize_sequence<'de, T, D>(
    deserializer: D,
    tag: &'static str,
) -> Result<Vec<T>, D::Error>
where
    T: Surrogated,
    T::Surrogate: Deserialize<'de>,
    D: serde::Deserializer<'de>,
{
    let value = Sequence::<T::Surrogate>::deserialize(deserializer)?;
    if value.t != tag {
        return Err(de::Error::invalid_value(
            de::Unexpected::Str(&value.t),
            &tag,
        ));
    }
    if value.bits != usize::BITS {
        return Err(de::Error::custom(
            "collection pointer width does not match target",
        ));
    }
    Ok(value.v.into_iter().map(Surrogate::into_real).collect())
}