working sections parse

This commit is contained in:
NikVolf
2017-03-29 19:40:51 +03:00
parent 4ab9e569d1
commit 3fa3a96d3a
3 changed files with 13 additions and 3 deletions

View File

@ -34,7 +34,8 @@ impl Deserialize for Unparsed {
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> { fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
let len = VarUint32::deserialize(reader)?.into(); let len = VarUint32::deserialize(reader)?.into();
let vec = vec![0u8; len]; let mut vec = vec![0u8; len];
reader.read_exact(&mut vec[..])?;
Ok(Unparsed(vec)) Ok(Unparsed(vec))
} }
} }

View File

@ -10,6 +10,10 @@ pub struct Module {
impl Module { impl Module {
pub fn version(&self) -> u32 { self.version } pub fn version(&self) -> u32 { self.version }
pub fn sections(&self) -> &[Section] {
&self.sections
}
} }
impl Deserialize for Module { impl Deserialize for Module {
@ -19,6 +23,7 @@ impl Deserialize for Module {
let mut sections = Vec::new(); let mut sections = Vec::new();
let magic = Uint32::deserialize(reader)?; let magic = Uint32::deserialize(reader)?;
let version = Uint32::deserialize(reader)?; let version = Uint32::deserialize(reader)?;
loop { loop {
@ -58,5 +63,6 @@ mod integration_tests {
let module = Module::deserialize(&mut reader).expect("Should be deserialized"); let module = Module::deserialize(&mut reader).expect("Should be deserialized");
assert_eq!(module.version(), 1); assert_eq!(module.version(), 1);
assert_eq!(module.sections().len(), 8);
} }
} }

View File

@ -10,9 +10,12 @@ impl Deserialize for Section {
type Error = Error; type Error = Error;
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> { fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
let id = VarUint7::deserialize(reader)?; let id = match VarUint7::deserialize(reader) {
// todo: be more selective detecting no more section
Err(_) => { return Err(Error::UnexpectedEof); },
Ok(id) => id,
};
let unparsed = Unparsed::deserialize(reader)?; let unparsed = Unparsed::deserialize(reader)?;
Ok(Section { Ok(Section {
id: id.0, id: id.0,
unparsed: unparsed, unparsed: unparsed,