serde_magnus 0.1.1

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

pub struct ArrayDeserializer {
    entries: Enumerator,
}

impl ArrayDeserializer {
    pub fn new(array: RArray) -> ArrayDeserializer {
        ArrayDeserializer {
            entries: array.each(),
        }
    }
}

impl<'i> SeqAccess<'i> for ArrayDeserializer {
    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(entry)).map(Some),
            Some(Err(error)) => Err(Error::from(error)),
            None => Ok(None),
        }
    }
}