use crate::error::Error;
use crate::metadata::Metadata;
use crate::metadata::MetadataRead;
use std::io;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;
pub struct Cart<T: Read + Seek> {
pub metadata: Metadata,
io: T,
}
impl<T: Read + Seek> Cart<T> {
pub fn try_from(io: T) -> Result<Self, Error> {
let mut io = io;
Ok(Self {
metadata: io.read_sfc_metadata()?,
io,
})
}
pub fn release(self) -> (Metadata, T) {
(self.metadata, self.io)
}
pub fn checksum(&mut self) -> Result<u16, Error> {
let mut io = &mut self.io;
self.metadata.compute_checksum(&mut io)
}
}
impl<T: Read + Seek> Read for Cart<T> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.io.read(buf)
}
}
impl<T: Read + Seek> Seek for Cart<T> {
fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
self.io.seek(pos)
}
}