use std::cell::RefCell;
use std::fmt;
use std::marker::PhantomData;
use anyhow::Result;
use serde::de::{SeqAccess, Visitor};
use serde::{Deserialize, Deserializer};
use serde_context::{context_scope, deserialize_with_context};
const JSON_NUMBERS: &str = "[[1, 2], [3, 4, 5], [6]]";
struct Value<T>(PhantomData<T>);
impl<'de, T: Deserialize<'de> + 'static> Deserialize<'de> for Value<T> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
context_scope(|cx| {
let value = T::deserialize(deserializer)?;
if let Ok(vec) = cx.get::<RefCell<Vec<T>>>() {
vec.borrow_mut().push(value);
}
Ok(Self(PhantomData))
})
}
}
struct Collect<T>(PhantomData<T>);
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Collect<T> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
struct CollectVisitor<T>(PhantomData<T>);
impl<'de, T: Deserialize<'de>> Visitor<'de> for CollectVisitor<T> {
type Value = Collect<T>;
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "a sequence")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
while let Ok(Some(_)) = seq.next_element::<T>() {}
Ok(Collect(PhantomData))
}
}
deserializer.deserialize_seq(CollectVisitor::<T>(PhantomData))
}
}
fn main() -> Result<()> {
let nums = RefCell::new(Vec::<i32>::new());
let mut deserializer = serde_json::Deserializer::from_str(JSON_NUMBERS);
let _: Collect<Collect<Value<i32>>> = deserialize_with_context(&mut deserializer, &nums)?;
let nums = nums.into_inner();
assert_eq!(nums, vec![1, 2, 3, 4, 5, 6]);
Ok(())
}