serde_magnus 0.11.0

Serde integration for Magnus
Documentation
use super::{array_enumerator::ArrayEnumerator, Deserializer};
use crate::error::Error;
use magnus::{RArray, Ruby};
use serde::de::{DeserializeSeed, SeqAccess};

pub struct ArrayDeserializer<'r> {
    ruby: &'r Ruby,
    entries: ArrayEnumerator<'r>,
}

impl<'r> ArrayDeserializer<'r> {
    pub fn new(ruby: &'r Ruby, array: RArray) -> ArrayDeserializer<'r> {
        ArrayDeserializer {
            ruby,
            entries: ArrayEnumerator::new(ruby, array),
        }
    }
}

impl<'r, 'i> SeqAccess<'i> for ArrayDeserializer<'r> {
    type Error = Error;

    fn next_element_seed<Seed>(&mut self, seed: Seed) -> Result<Option<Seed::Value>, Self::Error>
    where
        Seed: DeserializeSeed<'i>,
    {
        match self.entries.next() {
            Some(Ok(entry)) => seed
                .deserialize(Deserializer::new(self.ruby, entry))
                .map(Some),
            Some(Err(error)) => Err(error.into()),
            None => Ok(None),
        }
    }
}