Struct spectrusty_formats::tap::TapChunkReader
source · pub struct TapChunkReader<R> {
pub checksum: u8,
/* private fields */
}
Expand description
Implements a Reader of TAP chunks data.
Implements reader that reads only up to the size of the current TAP chunk.
Fields§
§checksum: u8
The checksum
is being updated when reading via Read methods from a TapChunkReader.
Implementations§
source§impl<R> TapChunkReader<R>
impl<R> TapChunkReader<R>
sourcepub fn into_inner(self) -> R
pub fn into_inner(self) -> R
Returns the wrapped reader.
sourcepub fn get_mut(&mut self) -> &mut Take<R>
pub fn get_mut(&mut self) -> &mut Take<R>
Returns a mutable reference to the chunk’s Take reader.
Examples found in repository?
More examples
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820
fn file_from_tap_reader<R: Read + Seek>(&mut self, rd: &mut TapChunkReader<R>) -> io::Result<u8> {
if rd.chunk_limit() == 0 {
rd.next_chunk()?;
}
let header = if let TapChunkInfo::Head(header) = TapChunkInfo::try_from(rd.get_mut())? {
header
}
else {
return Err(io::Error::new(io::ErrorKind::InvalidData, "not a TAP header"))
};
if let Some(chunk_size) = rd.next_chunk()? {
if chunk_size < 2 || header.length != chunk_size - 2 {
return Err(io::Error::new(io::ErrorKind::InvalidData, "not a TAP block"))
}
let mut flag = 0u8;
rd.read_exact(slice::from_mut(&mut flag))?;
if flag != DATA_BLOCK_FLAG {
return Err(io::Error::new(io::ErrorKind::InvalidData, "invalid TAP block flag"))
}
}
else {
return Err(io::Error::new(io::ErrorKind::InvalidData, "missing TAP chunk"))
}
let fbheader = MdrFileHeader::from(&header).into_array();
let hdrd = io::Cursor::new(fbheader).chain(rd.take(header.length as u64));
let res = self.store_file(header.name, true, hdrd)?;
{
let mut checksum = 0u8;
let res = rd.read_exact(slice::from_mut(&mut checksum));
if res.is_err() || rd.checksum != 0 {
self.erase_file(header.name);
return Err(io::Error::new(io::ErrorKind::InvalidData, "TAP block checksum error"))
}
}
Ok(res)
}
source§impl<R: Read + Seek> TapChunkReader<R>
impl<R: Read + Seek> TapChunkReader<R>
sourcepub fn try_from_current(rd: R, chunk_no: u32) -> Result<Self>
pub fn try_from_current(rd: R, chunk_no: u32) -> Result<Self>
Creates a new instance of TapChunkReader from the reader with an assumption that the next two bytes read from it will form the next chunk header.
chunk_no
should be the chunk number of the previous chunk.
sourcepub fn try_clone_mut(&mut self) -> Result<TapChunkReaderMut<'_, R>>
pub fn try_clone_mut(&mut self) -> Result<TapChunkReaderMut<'_, R>>
Creates a clone of self but with a mutable reference to the underlying reader.
Returns a guard that, when dropped, will try to restore the original position of the reader. However to check if it succeeded it’s better to use TapChunkReaderMut::done method directly on the guard which returns a result from the seek operation.
Trait Implementations§
source§impl<R> AsMut<TapChunkReader<R>> for TapChunkPulseIter<R>
impl<R> AsMut<TapChunkReader<R>> for TapChunkPulseIter<R>
source§fn as_mut(&mut self) -> &mut TapChunkReader<R> ⓘ
fn as_mut(&mut self) -> &mut TapChunkReader<R> ⓘ
source§impl<T, R> AsMut<TapChunkReader<R>> for TapReadInfoIter<T>where
T: Deref<Target = TapChunkReader<R>> + DerefMut,
impl<T, R> AsMut<TapChunkReader<R>> for TapReadInfoIter<T>where
T: Deref<Target = TapChunkReader<R>> + DerefMut,
source§fn as_mut(&mut self) -> &mut TapChunkReader<R> ⓘ
fn as_mut(&mut self) -> &mut TapChunkReader<R> ⓘ
source§impl<R> AsRef<TapChunkReader<R>> for TapChunkPulseIter<R>
impl<R> AsRef<TapChunkReader<R>> for TapChunkPulseIter<R>
source§fn as_ref(&self) -> &TapChunkReader<R> ⓘ
fn as_ref(&self) -> &TapChunkReader<R> ⓘ
source§impl<T, R> AsRef<TapChunkReader<R>> for TapReadInfoIter<T>where
T: Deref<Target = TapChunkReader<R>>,
impl<T, R> AsRef<TapChunkReader<R>> for TapReadInfoIter<T>where
T: Deref<Target = TapChunkReader<R>>,
source§fn as_ref(&self) -> &TapChunkReader<R> ⓘ
fn as_ref(&self) -> &TapChunkReader<R> ⓘ
source§impl<R: Debug> Debug for TapChunkReader<R>
impl<R: Debug> Debug for TapChunkReader<R>
source§impl<R: Read + Seek> From<TapChunkReader<R>> for TapChunkPulseIter<R>
impl<R: Read + Seek> From<TapChunkReader<R>> for TapChunkPulseIter<R>
source§fn from(rd: TapChunkReader<R>) -> Self
fn from(rd: TapChunkReader<R>) -> Self
source§impl<R: Read> Read for TapChunkReader<R>
impl<R: Read> Read for TapChunkReader<R>
source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
source§fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize>
buf
. Read more1.36.0 · source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
read
, except that it reads into a slice of buffers. Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
can_vector
)1.0.0 · source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
buf
. Read more1.6.0 · source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
buf
. Read moresource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
read_buf
)cursor
. Read more1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
Read
. Read moresource§impl<R: Read + Seek> TapChunkRead for TapChunkReader<R>
impl<R: Read + Seek> TapChunkRead for TapChunkReader<R>
source§fn next_chunk(&mut self) -> Result<Option<u16>>
fn next_chunk(&mut self) -> Result<Option<u16>>
Also clears TapChunkReader::checksum.
source§fn chunk_limit(&self) -> u16
fn chunk_limit(&self) -> u16
source§fn rewind(&mut self)
fn rewind(&mut self)
source§fn rewind_nth_chunk(&mut self, chunk_no: u32) -> Result<bool>
fn rewind_nth_chunk(&mut self, chunk_no: u32) -> Result<bool>
Ok(true)
if the nth chunk exists.
Otherwise returns Ok(false)
and leaves the seek position at the end of the tape. Read moresource§fn forward_chunk(&mut self) -> Result<bool>
fn forward_chunk(&mut self) -> Result<bool>
Ok(true)
if the forwarded to chunk exists.
Otherwise returns Ok(false)
and leaves the seek position at the end of the tape. Read moresource§fn rewind_prev_chunk(&mut self) -> Result<u32>
fn rewind_prev_chunk(&mut self) -> Result<u32>
Ok(chunk_no)
.source§fn rewind_chunk(&mut self) -> Result<u32>
fn rewind_chunk(&mut self) -> Result<u32>
Ok(chunk_no)
.Auto Trait Implementations§
impl<R> RefUnwindSafe for TapChunkReader<R>where
R: RefUnwindSafe,
impl<R> Send for TapChunkReader<R>where
R: Send,
impl<R> Sync for TapChunkReader<R>where
R: Sync,
impl<R> Unpin for TapChunkReader<R>where
R: Unpin,
impl<R> UnwindSafe for TapChunkReader<R>where
R: UnwindSafe,
Blanket Implementations§
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
source§impl<S, T> IntoSample<S> for Twhere
S: FromSample<T>,
impl<S, T> IntoSample<S> for Twhere
S: FromSample<T>,
source§fn into_sample(self) -> S
fn into_sample(self) -> S
S
a sample type from self
.§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> Rwhere
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> Rwhere
Self: BorrowMut<B>,
B: 'a + ?Sized,
R: 'a,
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> Rwhere
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> Rwhere
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
source§impl<R> ReadExactEx for Rwhere
R: Read,
impl<R> ReadExactEx for Rwhere
R: Read,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Selfwhere
Self: Deref<Target = T>,
T: ?Sized,
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Selfwhere
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds. Read more§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Selfwhere
Self: Borrow<B>,
B: ?Sized,
.tap_borrow()
only in debug builds, and is erased in release
builds. Read more§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Selfwhere
Self: BorrowMut<B>,
B: ?Sized,
.tap_borrow_mut()
only in debug builds, and is erased in release
builds. Read more§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Selfwhere
Self: AsRef<R>,
R: ?Sized,
.tap_ref()
only in debug builds, and is erased in release
builds. Read more§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Selfwhere
Self: AsMut<R>,
R: ?Sized,
.tap_ref_mut()
only in debug builds, and is erased in release
builds. Read more