use {Parcel, Error};
use types;
use std::io::prelude::*;
use std;

/// A newtype wrapping `Vec<T>` but with a custom length prefix type.
#[derive(Clone, Debug, PartialEq)]
pub struct Vec<S: types::Integer, T: Parcel>
{
    /// The inner `Vec<T>`.
    pub elements: std::vec::Vec<T>,
    _a: std::marker::PhantomData<S>,
}

impl<S: types::Integer, T: Parcel> Vec<S,T>
{
    /// Creates a new `Vec` from a list of elements.
    pub fn new(elements: std::vec::Vec<T>) -> Self {
        Vec { elements: elements, _a: std::marker::PhantomData }
    }
}

impl<S: types::Integer, T: Parcel> Parcel for Vec<S, T>
{
    const TYPE_NAME: &'static str = "protocol::Vec<S,T>";

    fn read(read: &mut Read) -> Result<Self, Error> {
        let elements = types::util::read_list_ext::<S,T>(read)?;
        Ok(Self::new(elements))
    }

    fn write(&self, write: &mut Write) -> Result<(), Error> {
        types::util::write_list_ext::<S,T,_>(write, self.elements.iter())
    }
}

/// Stuff relating to `std::vec::Vec<T>`.
mod std_vec {
    use {Error, Parcel};
    use types;
    use std::io::prelude::*;
    use std::prelude::v1::*;

    impl<T: Parcel> Parcel for Vec<T>
    {
        const TYPE_NAME: &'static str = "Vec<T>";

        fn read(read: &mut Read) -> Result<Self, Error> {
            types::util::read_list(read)
        }

        fn write(&self, write: &mut Write) -> Result<(), Error> {
            types::util::write_list(write, self.iter())
        }
    }
}

