diff --git a/src/elements/mod.rs b/src/elements/mod.rs index fca2dae..37a8f9f 100644 --- a/src/elements/mod.rs +++ b/src/elements/mod.rs @@ -18,7 +18,7 @@ pub use self::export_entry::{ExportEntry, Internal}; pub use self::global_entry::GlobalEntry; pub use self::primitives::{ VarUint32, VarUint7, VarUint1, VarInt7, Uint32, - Uint64, VarUint64, CountedList, CountedWriter, + Uint64, VarUint64, CountedList, CountedWriter, CountedListWriter, }; pub use self::types::{ValueType, BlockType}; pub use self::ops::{Opcode, Opcodes, InitExpr}; diff --git a/src/elements/primitives.rs b/src/elements/primitives.rs index 18f1364..7a5fc11 100644 --- a/src/elements/primitives.rs +++ b/src/elements/primitives.rs @@ -221,7 +221,7 @@ impl CountedList { pub fn into_inner(self) -> Vec { self.0 } } -impl Deserialize for CountedList where T::Error : From { +impl Deserialize for CountedList where T::Error: From { type Error = T::Error; fn deserialize(reader: &mut R) -> Result { @@ -272,6 +272,22 @@ impl<'a, W: 'a + io::Write> io::Write for CountedWriter<'a, W> { } } +pub struct CountedListWriter, T: IntoIterator>(pub usize, pub T); + +impl, T: IntoIterator> Serialize for CountedListWriter { + type Error = Error; + + fn serialize(self, writer: &mut W) -> Result<(), Self::Error> { + let len_us = self.0; + let data = self.1; + let len: VarUint32 = len_us.into(); + len.serialize(writer)?; + for data_element in data { data_element.serialize(writer)? } + + Ok(()) + } +} + #[cfg(test)] mod tests { diff --git a/src/elements/section.rs b/src/elements/section.rs index 1699f2e..5c489ae 100644 --- a/src/elements/section.rs +++ b/src/elements/section.rs @@ -1,5 +1,4 @@ use std::io; -use std::io::Write; use super::{ Serialize, Deserialize, @@ -18,6 +17,7 @@ use super::{ ElementSegment, DataSegment, CountedWriter, + CountedListWriter, }; use super::types::Type; @@ -296,10 +296,12 @@ impl Serialize for DataSection { type Error = Error; fn serialize(self, writer: &mut W) -> Result<(), Self::Error> { - let mut counted_writer = CountedWriter::new(writer); - let test = vec![0u8; 12]; - counted_writer.write(&test[..])?; - counted_writer.done()?; + let data = self.0; + let counted_list = CountedListWriter::( + data.len(), + data.into_iter().map(Into::into), + ); + counted_list.serialize(writer)?; Ok(()) } } diff --git a/src/elements/segment.rs b/src/elements/segment.rs index 7756127..3cd3b79 100644 --- a/src/elements/segment.rs +++ b/src/elements/segment.rs @@ -1,5 +1,5 @@ use std::io; -use super::{Deserialize, Error, VarUint32, CountedList, InitExpr}; +use super::{Deserialize, Serialize, Error, VarUint32, CountedList, InitExpr}; pub struct ElementSegment { index: u32, @@ -62,4 +62,12 @@ impl Deserialize for DataSegment { value: value_buf, }) } +} + +impl Serialize for DataSegment { + type Error = Error; + + fn serialize(self, writer: &mut W) -> Result<(), Self::Error> { + Ok(()) + } } \ No newline at end of file