-impl<R: Read + Seek + 'static> State for Headers<R> {
- fn read(mut self: Box<Self>) -> Result<Option<(Record, Box<dyn State>)>, Error> {
- let endian = self.0.endian;
- let rec_type: u32 = endian.parse(read_bytes(&mut self.0.reader)?);
- let record = match rec_type {
- 2 => {
- let variable = read_variable_record(&mut self.0.reader, endian)?;
- self.0.var_types.push(VarType::from_width(variable.width));
- Record::Variable(variable)
- }
- 3 => Record::ValueLabel(read_value_label_record(&mut self.0.reader, endian)?),
- 4 => Record::VarIndexes(read_var_indexes_record(&mut self.0.reader, endian)?),
- 6 => Record::Document(read_document_record(&mut self.0.reader, endian)?),
- 7 => Record::Extension(read_extension_record(&mut self.0.reader, endian)?),
- 999 => {
- let _: [u8; 4] = read_bytes(&mut self.0.reader)?;
- let next_state: Box<dyn State> = match self.0.compression {
- None => Box::new(Data(self.0)),
- Some(Compression::Simple) => Box::new(CompressedData::new(self.0)),
- Some(Compression::ZLib) => Box::new(ZlibHeader(self.0)),
- };
- return Ok(Some((Record::EndOfHeaders, next_state)));
- }
- _ => {
- return Err(Error::BadRecordType {
- offset: self.0.reader.stream_position()?,
- rec_type,
- })
+ struct Headers<R: Read + Seek>(CommonState<R>);
+
+ impl<R: Read + Seek + 'static> State for Headers<R> {
+ fn read(mut self: Box<Self>) -> Result<Option<(Record, Box<dyn State>)>, Error> {
+ let record = Record::read(&mut self.0.reader, self.0.endian)?;
+ match record {
+ Record::Variable(Variable { width, .. }) => {
+ self.0.var_types.push(VarType::from_width(width));
+ }
+ Record::EndOfHeaders(_) => {
+ let next_state: Box<dyn State> = match self.0.compression {
+ None => Box::new(Data(self.0)),
+ Some(Compression::Simple) => Box::new(CompressedData::new(self.0)),
+ Some(Compression::ZLib) => Box::new(ZlibHeader(self.0)),
+ };
+ return Ok(Some((record, next_state)));
+ }
+ _ => (),
+ };
+ Ok(Some((record, self)))
+ }
+ }
+
+ struct ZlibHeader<R: Read + Seek>(CommonState<R>);
+
+ impl<R: Read + Seek + 'static> State for ZlibHeader<R> {
+ fn read(mut self: Box<Self>) -> Result<Option<(Record, Box<dyn State>)>, Error> {
+ let zheader = ZHeader::read(&mut self.0.reader, self.0.endian)?;
+ Ok(Some((Record::ZHeader(zheader), self)))
+ }
+ }
+
+ struct ZlibTrailer<R: Read + Seek>(CommonState<R>, ZHeader);
+
+ impl<R: Read + Seek + 'static> State for ZlibTrailer<R> {
+ fn read(mut self: Box<Self>) -> Result<Option<(Record, Box<dyn State>)>, Error> {
+ let retval = ZTrailer::read(
+ &mut self.0.reader,
+ self.0.endian,
+ self.1.ztrailer_offset,
+ self.1.ztrailer_len,
+ )?;
+ let next_state = Box::new(CompressedData::new(CommonState {
+ reader: ZlibDecodeMultiple::new(self.0.reader),
+ endian: self.0.endian,
+ bias: self.0.bias,
+ compression: self.0.compression,
+ var_types: self.0.var_types,
+ }));
+ match retval {
+ None => next_state.read(),
+ Some(ztrailer) => Ok(Some((Record::ZTrailer(ztrailer), next_state))),