use serde;

pub struct CdrSeqVisitor<'a, T> where T: Sized + 'a + serde::Deserializer  {
    pub deserializer: &'a mut T,
    pub len: usize,
    pub debug: bool
}

impl<'a,T> CdrSeqVisitor<'a,T> where T: serde::Deserializer {
    pub fn new(t: &'a mut T, len: usize, debug: bool) -> Self {
        CdrSeqVisitor{ deserializer: t, len: len, debug: debug }
    }
}

impl<'a,R> serde::de::SeqVisitor for CdrSeqVisitor<'a,R> where R: serde::Deserializer {
    type Error = R::Error;

    fn visit<T>(&mut self) -> Result<Option<T>,Self::Error> where T: serde::Deserialize {
        if self.len == 0 {
            return Ok(None);
        }

        self.len -= 1;
        serde::Deserialize::deserialize(self.deserializer).map(Some)
    }

    fn end(&mut self) -> Result<(),Self::Error> {
        Ok(())
    }

    fn size_hint(&self) -> (usize, Option<usize>) {
        if self.len == 0 {
            (self.len,None)
        } else {
            (self.len,Some(self.len))
        }
    }
}